【问题标题】:Python how to erase a file once it's opened with "with"Python如何在使用“with”打开文件后擦除文件
【发布时间】:2019-03-13 11:06:22
【问题描述】:

我将脚本的循环迭代次数保存到检查点文件中:

with open('checkpoint.txt', 'w') as checkpoint_file:
    for i range(1000):
        //do stuff
        checkpoint_file.write(str(i) + '\n')

这将为每次迭代在我的文件中写入一个新行。

我希望在我中断脚本时只有一行包含最后一个迭代号,所以我想擦除“checkpoint.txt”文件的内容,然后在第一行写下我的迭代号(或者如果可能的话直接替换第一行)。

我知道如果我关闭文件然后用with open('checkpoint.txt', 'w') 再次打开它,它的内容将被删除,但为了提高效率,我想尽可能保持文件打开。

最好的方法是什么?

【问题讨论】:

标签: python file


【解决方案1】:

seeking 在每个 write 之前(并切换到行缓冲以避免需要单独使用 flush)会这样做:

# buffering=1 means you automatically flush after writing a line
with open('checkpoint.txt', 'w', buffering=1) as checkpoint_file:
    for i in range(1000):
        //do stuff
        checkpoint_file.seek(0)  # Seek back to beginning of file so next write replaces contents
        checkpoint_file.write(str(i) + '\n')

【讨论】:

  • 我会添加一个truncate 来处理下一行比上一行短的情况...
  • @SergeBallesta:在一般情况下,是的,这是正确的。在这种特殊情况下,检查点是一个单调递增的数字,因此每个新写入的字符串将始终与先前的输出一样长或更长,因此无需显式地 truncate (除非你是使用一种非常奇怪的文本编码,以至于将int 字符串化产生的不同数字编码为可变数量的字节;如果您知道这种编码,请告诉我,这将是另一个与计算机相关的事实用 :-) 折磨人)。
【解决方案2】:

在每次写入之前寻找文件的开头。 见https://docs.python.org/2/library/stdtypes.html?highlight=seek#file.seek

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 2011-06-04
    • 2017-03-02
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多