为什么我的脚本使用 'w' 模式打开文件以删除内容后只写入一行?

3
我有一个名为fName.txt的文件在一个目录中。运行以下Python代码片段将通过执行循环(包含片段)三次,将6个数字添加到文本文件中的3行和2列。
但是,在写入新数据之前,我想完全清空该文件。(否则,多次运行脚本会产生比模拟所需的三行更多的行,这将产生无意义的结果;换句话说,脚本只需要从模拟中生成的三行)。
我查阅了以下页面,其中解释了如何操作:how to delete only the contents of file in python,但我无法将其应用到我的示例中。
特别地,在pass语句后,鉴于我的文件一开始就被关闭,并且必须在执行print语句后再次关闭,我不确定语句的顺序。每次,我都会收到不同的错误消息,无论如何都无法避免。下面是一种错误类型,表明内容已被删除(很可能是在print语句之后):
/usr/lib/python3.4/site-packages/numpy/lib/npyio.py:1385: UserWarning: genfromtxt: Empty input file: "output/Images/MW_Size/covering_fractions.txt"
  warnings.warn('genfromtxt: Empty input file: "%s"' % fname)
Traceback (most recent call last):
  File "Collector2.py", line 81, in <module>
    LLSs, DLAs = np.genfromtxt(r'output/Images/MW_Size/covering_fractions.txt', comments='#', usecols = (0,1), unpack=True)
ValueError: need more than 0 values to unpack

这就是为什么我决定保留代码片段的最简形式,而没有使用页面上的任何建议:
covering_fraction_data = "output/Images/MW_Size/covering_fractions.txt"    
with open(covering_fraction_data, "mode") as fName:
    print('{:.2e} {:.2e}'.format(lls_number/grid_number, dla_number/grid_number), file=fName)
    fName.close()

每次模拟运行会生成3行应当被打印到文件中。当mode'a'时,生成的三行将添加到现有文件中,因此文本文件将包含多于三行的内容,因为它已经包含了一些内容。将'a'更改为'w'后,文本文件中只有1行被打印出来;前两行不希望被删除。
解决方法:
唯一的解决方法是在运行代码之前选择'a'模式并手动删除文件的内容。这样,在运行代码后,文本文件中只会产生三行预期输出。
问题:
如何修改上述代码以实现自动删除文件,并在填充新的三行之前进行操作?

以写模式打开文件,而不是追加模式,以清空文件。 - Nick stands with Ukraine
1
“我无法将其实现到我的示例中”,能否详细说明一下您为什么无法实现它? - Dimitris Fasarakis Hilliard
我刚刚更深入地研究了这个问题。我正在尝试完全避免使用 delete 函数,而是每次模拟运行时都使用“w”模式从头开始生成文件。 - Ash
2个回答

6
您正在使用“追加”模式('a')打开文件。指定此模式时,新文本将附加到现有文件内容上。您需要使用“写入”模式,即 open(filename, 'w')。这会在您每次打开文件时覆盖文件内容。

抱歉,原始代码中是 'w',我改了几次最终变成了 'a'。但即使是 'w' 也无法正常工作。 - Ash
@Allan 我不明白。你说有三次运行,但你只看到了最后一次的结果。但是在你提供的代码中,你只打印了一次文件,因此对于每次运行,文件的内容都被覆盖了。如果你确实写了三次文件,那么请记住,在使用“w”模式时,文件会在打开它时被覆盖。这意味着,如果你想要每个程序运行三个结果,你必须只打开一次文件,然后继续写入它,或者第一次使用“w”打开它,其他时间使用“a”打开它。 - rubik
很抱歉造成误解。该代码每次运行会生成三行连续的结果。我不应该使用“运行三次”这个词。实际上,每次运行确实需要三个结果,我需要打开文件一次,然后持续写入,直到填满所有三行,然后关闭文件。 - Ash

0

使用模式“w”可以删除文件的内容并覆盖文件,但会防止包含上述片段的循环打印两次,从而产生两行数据。换句话说,使用“w”模式与我给出的代码不兼容,因为它应该将数据打印到文件中三次(由于包含此片段的循环执行三次)。因此,我不得不通过以下命令行在main.py代码中清空文件:

os.system("> output/Images/MW_Size/covering_fractions.txt")

只有在上面提到的代码片段中使用“a”模式。这样,循环将按预期执行并打印到空文件中三次,而不会删除前两行。

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