如何在python脚本中写入之前删除文件的内容?

时间:2016-10-12 23:18:21

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

我在目录中有一个名为fName.txt的文件。运行以下python片段(来自模拟)将通过执行循环(包含片段)三次将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:空输入文件:“output / Images / MW_Size / covering_fractions.txt”     warnings.warn('genfromtxt:空输入文件:“%s”'%fname)   Traceback(最近一次调用最后一次):     文件“Collector2.py”,第81行,in       LLS,DLAs = np.genfromtxt(r'output / Images / MW_Size / covering_fractions.txt',comments ='#',usecols =(0,1),unpack = True)   ValueError:需要超过0个值才能解压缩

这就是为什么我决定以最简单的形式保留代码段,而不使用该页面中的任何一条建议:

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

问题:

所以,我的问题基本上是,“我怎么能修改上面的代码来实际删除文件自动 之前它已经填满了三个新行?“

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

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