更好的文件写入方式?

3

目标:

我有一个名为 airplanes.txt 的文件,其中已经包含了一些我最喜欢的飞机:

Boeing 747
Airbus A380

我在我的主应用程序中获取用户输入,以便将用户指定的飞机添加到airplanes.txt文件中。

示例: 请输入您想要添加到收藏夹列表中的飞机名称:<<Boeing 737>>

如果你现在查看airplanes.txt文件,你会看到:

Boeing 747
Airbus A380
Boeing 737

我的问题: 下面的代码首先获取了airplanes.txt中现有的数据。

airplane_file = open('airplanes.txt', 'r')

favourite_airplanes = [ line.strip('\n') for line in airplane_file.readlines()]

airplane_file.close()

接下来,我关闭文件,然后获取用户输入。
add_plane = input('Enter The Airplane You Would Like To Add To This List: ')

最后,我将文件中的所有现有数据写回,并将用户输入添加到其中。

if add_plane != None:
    reopened_airplane_file = open('airplanes.txt', 'r+')
    for airplane in favourite_airplanes:
        reopened_airplane_file.write(f'{airplane}\n')
    else:
        reopened_airplane_file.write(f'{add_plane}\n')

我觉得应该能够将数据写入包含数据的现有文件中,而不需要将所有数据重新写入文件再添加新数据。

对于非常大的文件,仅需将现有数据写回文件,然后写入期望添加的新数据,这将变得越来越繁琐。

为了使问题易读,我已经将代码分解了,希望您不介意这个长问题。:)

编辑:

这对我起作用:

with open('airplanes.txt', 'a+') as file:
    add_plane = input('Enter The Airplane You Would Like To Add To This List: ')
    file.write(f'{add_plane}\n')

为什么不起作用: 我使用的是“r+”模式,这意味着我正在覆盖,而适当的模式应该是“a+”! “a+”用于读取和追加(在文件末尾写入)。如果文件不存在,则创建该文件。

你听说过“append”吗? - Jan
不是的,虽然只调用write()看起来很简单,但实际上并不是这样。 - XtremeDevX
4个回答

2

您可以以不同的模式打开文件,即读取它们、向它们写入或将其附加。这是通过第二个参数 "r"、"w"、"a" 实现的,可选地带有 "+" 或 "b" 用于 "字节模式"。此外,请改用 with open(...)
也就是说,您可以使用以下代码:

with open("test.txt", "a+") as file:
    file.write("\nBoeing 737")

嘿,我尝试了这个但它不起作用,它删除了我的一些现有数据。 - XtremeDevX
@TheBossProSniper:请更加明确地说明“不起作用”的具体情况。 - Jan
我编辑了我的问题,现在似乎数据被覆盖了。 - XtremeDevX
嘿,它仍然被覆盖了。 - XtremeDevX
我正在尝试你建议的方法,但是由于某些奇怪的原因,它正在覆盖我的文件。 - XtremeDevX
你能解释一下a+代表什么吗?我想了解是什么导致了写入失败。 - XtremeDevX

1
你可以同时读取、写入/追加到文件中,因此以下是在你的情况下如何运作的方式:
with open('airplanes.txt', 'a+') as airplane_file:
    
    favourite_airplanes = [line.strip('\n') for line in airplane_file.readlines()]
    
    add_plane = input('Enter The Airplane You Would Like To Add To This List: ')
    
    if add_plane != None:
        airplane_file.write(f'{add_plane}\n')

1
with open("airplanes.txt", "a+") as ap_txt:
    add_plane = input('Enter The Airplane You Would Like To Add To This List: ')
    ap_txt.write("\n{}".format(add_plane))

谢谢您提供简洁明了的答案,我花了很多时间来写这个问题 :) 如果您能点赞,我会非常感激,因为很多初学者不知道a+标签,而认为w+或r+标签可以解决问题。 - XtremeDevX
完整的答案很好。强调a+并附上一些解释会使一个好的答案更加优秀。 - Chris

1
with open('airplanes.txt', 'a+') as f:

 fav_air = f.readlines()

planes_list = [i.strip() for i in fav_air] 

add_plane = input('Enter The Airplane You Would Like To Add To This List: ') 

for plane in planes_list:

      if add_plane != plane:

             f.write("\n")
        
            # Append text at the end of file
        
             f.write(plane)
     
      else:

            print(" Airplane already in the list") 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接