使用 Python 读取并覆盖文件
- 2025-03-05 09:14:00
- admin 原创
- 27
问题描述:
目前我正在使用这个:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
但问题是旧文件比新文件大。所以我最终得到一个新文件,其末尾有旧文件的一部分。
解决方案 1:
如果您不想关闭并重新打开文件,为了避免竞争条件,您可以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()
解决方案 2:
该fileinput
模块具有一种inplace
模式,用于将更改写入您正在处理的文件,而无需使用临时文件等。该模块很好地封装了循环遍历文件列表中的行的常见操作,通过一个对象,如果您想在循环内检查文件名、行号等,该对象可以透明地跟踪它们。
from fileinput import FileInput
for line in FileInput("file", inplace=1):
line = line.replace("foobar", "bar")
print(line)
解决方案 3:
text = re.sub('foobar', 'bar', text)
可能之后关闭文件,重新打开进行写入(从而清除旧内容),并将更新后的文本写入其中会更容易、更整洁。
解决方案 4:
我发现先读后写更容易记住。
例如:
with open('file') as f:
data = f.read()
with open('file', 'w') as f:
f.write('hello')
解决方案 5:
对于任何想要按行读取和覆盖的人,请参考这个答案。
https://stackoverflow.com/a/71285415/11442980
filename = input("Enter filename: ")
with open(filename, 'r+') as file:
lines = file.readlines()
file.seek(0)
for line in lines:
value = int(line)
file.write(str(value + 1))
file.truncate()
解决方案 6:
尝试将其写入新文件中..
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()
解决方案 7:
老实说,你可以看一下我构建的这个类,它执行基本的文件操作。写入方法会覆盖旧数据,而附加方法会保留旧数据。
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)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD