2016-02-28 118 views
3

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

#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) 

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

+1

你能详细说明什么不起作用吗? –

+0

它是否读取文件,但不写入,或根本没有? – Menasheh

+0

'w +'截断了一个文件,所以在'f.read()'中它总是空的。 'a +'也会创建文件,但是在阅读之前您需要寻找开始。 – AChampion

回答

3

找到前端后截断文件。这将删除所有的现有数据。

>>> 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' 
>>> 
+0

它仍然不起作用。我在循环中使用代码,每次从文件中读取的数据都是我在循环开始之前给它的原始数据 - 它不覆盖文件... – pystudent

+0

然后,我们可能必须责怪你的其他代码。例如,'process'只是返回相同的数据? (你可以添加'assert data!= new_data'来调试,也许你正在编写一个不同于你想象的文件,用'os.path.abspath'打印你实际使用的文件 – tdelaney

+0

谢谢你的回答,正如你所建议的那样,我在代码中的另一个地方发现了这个问题。 – pystudent

0

您应该在seek之后添加truncate的电话,建议使用tdelaney

尝试在不同范围内读写,代码更加清晰,数据处理在文件处理程序打开时不会完成。

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) 
+0

你是完全正确的,我已经改变了一下我的代码,但它仍然不起作用。 – pystudent