为什么我的脚本在用 'w' 打开文件后只写入 1 行以在写入前删除内容?

Why is my script only writing 1 row to the file after opening it with 'w' to delete the contents before writing?

我在目录中有一个名为 fName.txt 的文件。 运行 以下 Python 代码段将通过执行循环(包含代码段)三次将 6 个数字添加到文本文件中的 3 行和 2 列中。

但是,我想在写入新数据之前完全清空文件。 (否则 运行多次使用脚本会产生模拟所需的三行以上,这会产生无意义的结果;换句话说,脚本只需要 see 三行刚从模拟中产生)。

我看到了以下页面 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' 后,文本文件中不再打印 3 行,而是只打印 1 行;前两行被意外删除。

解决方法:

避免这一切的唯一方法是选择 'a' 模式并在 运行 执行代码之前手动删除文件内容。这样,在 运行 输出预期的代码后,文本文件中只生成三行。

问题:

我如何修改上面的代码以实际删除文件 自动 并且 填充三个新行之前?

您正在使用 'append' 模式 ('a') 打开您的文件。指定此模式时,新文本将附加到现有文件内容。您正在寻找 'write' 模式,即 open(filename, 'w')。这将在您每次 打开 文件时覆盖文件内容。

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

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

然后才使用上述代码段中的'a'模式。这样,循环将按预期执行并打印到空文件中 3 次,而不会删除前两行。