读取文件,然后在 Python 中覆盖它

Posted

技术标签:

【中文标题】读取文件,然后在 Python 中覆盖它【英文标题】:Reading a file and then overwriting it in Python 【发布时间】:2016-06-11 07:12:14 【问题描述】:

我一直在尝试读取一个文件,然后用一些更新的数据覆盖它。 我试过这样做:

#Created filename.txt with some data
with open('filename.txt', 'r+') as f:
    data = f.read()
    new_data = process(data)  # data is being changed
    f.seek(0)
    f.write(new_data)

由于某种原因,它不会覆盖文件并且它的内容保持不变。

【问题讨论】:

你能详细说明什么不起作用吗? 是读文件不写文件,还是什么都不写? w+ 截断文件,因此f.read() 上的文件始终为空。 a+ 也会创建文件,但您需要在阅读之前找到开头。 @AChampion 你说得对,我稍微改变了我的问题。 什么不起作用,这将覆盖数据 - 但如果更新小于原始数据,则会留下数据。只需将调用拆分为 2 个 with 语句,一个 with open(..., 'r') 和一个 with open(..., 'w') - 截断。 【参考方案1】:

您应该按照tdelaney 的建议在seek 之后添加对truncate 的调用。

尝试在不同的范围内进行读写,这样代码更清晰,并且在打开文件处理程序时不会进行数据处理。

data = ''
with open('filename.txt', 'r') as f:
    data = f.read()

new_data = process(data)  
with open('filename.txt', 'w+') as f:
    f.write(new_data)

【讨论】:

你说的很对,我的代码稍微改了一下,还是不行。【参考方案2】:

搜索到前面后截断文件。这将删除所有现有数据。

>>> open('deleteme', 'w').write('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
>>> f = open('deleteme', 'r+')
>>> f.read()
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> f.seek(0)
>>> f.truncate()
>>> f.write('bbb')
>>> f.close()
>>> open('deleteme').read()
'bbb'
>>> 

【讨论】:

还是不行。我在循环中使用代码,每次从文件中读取的数据都是我在循环开始之前给它的原始数据 - 它不会覆盖文件... 那我们可能要怪你的其他代码了。例如,process 是否只返回相同的数据? (您可以添加assert data != new_data 进行调试。也许您正在编写与您想象的不同的文件。使用os.path.abspath 打印您实际使用的文件。 感谢您的回答,正如您所建议的那样,我在代码的另一个地方发现了问题。 出于某种原因,这是我发现将.truncate() 放在正确位置的唯一答案。耶

以上是关于读取文件,然后在 Python 中覆盖它的主要内容,如果未能解决你的问题,请参考以下文章

Logstash无法读取文件的更新内容

在使用 python 写入时从日志文件中读取

解析 .py 文件,读取 AST,修改它,然后写回修改后的源代码

TXT 文件上的 Python 项目,如何读取字数和排序

在python中使用liblas和laspy读取las文件的问题

节点无法读取python保存的文件