【问题标题】:Why is my script only writing 1 row to the file after opening it with 'w' to delete the contents before writing?为什么我的脚本在使用“w”打开文件后只向文件写入 1 行以在写入前删除内容?
【发布时间】:2017-02-21 22:04:44
【问题描述】:

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

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

我遇到了以下页面 how to delete only the contents of file in python,它解释了如何做到这一点,但我无法在我的示例中实现它。

特别是,在pass 语句之后,我不确定语句的顺序,因为我的文件一开始就关闭了,并且一旦执行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

这就是为什么我决定将 sn-p 保留为最简单的形式,而不使用该页面中的任何建议:

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' 模式并在运行代码之前手动删除文件的内容。这样,在运行代码后,文本文件中只生成了三行,这正是输出所期望的。

问题:

我怎样才能修改上面的代码来真正删除文件自动之前它被三个新行填充?

【问题讨论】:

  • 以写入模式打开而不是附加模式先清除文件
  • "我无法在我的示例中实现它";想详细说明为什么你不能?
  • 我只是在这个问题上做了更多的努力。我试图完全避免 delete 功能,而是在每次模拟运行时使用“w”模式从头开始生成文件。

标签: python python-3.x file-io seek


【解决方案1】:

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

【讨论】:

  • 抱歉,原来的 sn-p 是 'w',我改了几次,最后变成了 'a'。但仍然无法使用“w”。
  • @Allan 我不明白。您说有 3 次运行,而您只看到最后一次的结果。但是在您提供的代码中,您只打印到文件一次,因此每次运行都会覆盖文件的内容。如果您确实向文件写入了 3 次,请记住,使用 'w' 模式,文件会在打开文件时被覆盖。这意味着,如果您希望每个程序运行三个结果,您必须只打开一次,然后继续写入,或者第一次用“w”打开,其他时候用“a”打开。
  • 抱歉造成误会。该代码为每次运行生成三个连续的行。我不应该用“跑三遍”这个词。所以,是的,事实上我每次运行需要三个结果,我只需要打开一次,然后继续写入,直到所有三行都填满,然后关闭文件。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多