在Python中读取和覆盖文件
目前我使用的是:在Python中读取和覆盖文件,python,file,overwrite,Python,File,Overwrite,目前我使用的是: f = open(filename, 'r+') text = f.read() text = re.sub('foobar', 'bar', text) f.seek(0) f.write(text) f.close() 但问题是旧文件比新文件大。因此,我最终得到了一个新文件,该文件的末尾有旧文件的一部分。在text=re.sub('foobar',bar',text)重新打开文件进行写入(从而清除旧内容)之后,关闭该文件可能会更容易、更整洁,并将更新后的文本写入其中。该模
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
但问题是旧文件比新文件大。因此,我最终得到了一个新文件,该文件的末尾有旧文件的一部分。在
text=re.sub('foobar',bar',text)
重新打开文件进行写入(从而清除旧内容)之后,关闭该文件可能会更容易、更整洁,并将更新后的文本写入其中。该模块有一个就地
模式,用于在不使用临时文件等的情况下将更改写入正在处理的文件。该模块通过一个透明跟踪文件名的对象,很好地封装了在文件列表中的行上循环的常见操作,如果要在回路内检查,请使用线号等
from fileinput import FileInput
for line in FileInput("file", inplace=1):
line = line.replace("foobar", "bar")
print(line)
如果您不想关闭并重新打开文件,为了避免竞争条件,您可以: 该功能可能还将使用
open
作为上下文管理器,即使出现错误,也会关闭文件处理程序
with open(filename, 'r+') as f:
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
尝试将其写入新文件
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()
老实说,您可以看看我构建的这个类,它执行基本的文件操作。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)
我发现读了然后再写更容易记住 例如: 打开('file')作为f的
:
data=f.read()
将open('file','w')作为f:
f、 写(‘你好’)
我想清楚一点-你的第二个剪辑是否应该在f.truncate()
之后有f.write(text)
?@volvoxf.write(text)
在f.truncate()之前;它首先写入文本
,因此在.write()之后
文件光标位于文本
的末尾。继续截断该文件将删除该文件在此点之后可能具有的任何剩余字节。在这种情况下,最终结果将与写入之前被截断的结果相同。对于非常大的文件,将整个文件内容读入内存可能会变得非常笨拙。因此,该方法可以成为首选方法。当传递inplace=1
时,它将首先将文件移动到临时位置,然后将新文件写入旧文件名路径。这种移动操作在unix文件系统上很快,因为它只移动文件系统inode
,而不是全部内容。然后您可以分别读取和处理每一行,以避免内存膨胀。:-)
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)