【发布时间】: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