问题:在Python中读取和覆盖文件
目前,我正在使用此:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
但是问题在于旧文件大于新文件。因此,我最终得到一个新文件,该文件的末尾包含旧文件的一部分。
回答 0
如果您不想关闭并重新打开文件,为避免出现竞争情况,可以truncate
这样做:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
该功能将很可能也更清洁和更安全的使用open
作为一个上下文管理器,这将关闭该文件处理程序,即使出现错误!
with open(filename, 'r+') as f:
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
回答 1
在关闭文件之后text = re.sub('foobar', 'bar', text)
,重新打开文件以进行写入(从而清除旧内容),然后将更新后的文本写入其中,可能会更容易更整洁。
回答 2
该inline
模式,用于在不使用临时文件等的情况下将更改写入正在处理的文件。该模块很好地封装了通过对象透明地跟踪文件名来循环遍历文件列表中的行的常见操作,行号等,如果您想在循环中检查它们。
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
回答 3
老实说,您可以看一下我构建的该类,它执行基本的文件操作。write方法将覆盖并追加保留旧数据。
class IO:
def read(self, filename):
toRead = open(filename, "rb")
out = toRead.read()
toRead.close()
return out
def write(self, filename, data):
toWrite = open(filename, "wb")
out = toWrite.write(data)
toWrite.close()
def append(self, filename, data):
append = self.read(filename)
self.write(filename, append+data)
回答 4
尝试将其写入新文件中。
f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。