Python 从文件读取后回写到同一文件 我的目标是从文件中读取行,在它的结尾处除去空白,然后写回同一个文件中。我尝试了以下代码: with open(filename, 'r+') as f: for i in f: f.write(i.rstrip()+"\n")
这似乎写在文件的末尾,保持文件中的初始数据完好无损。我知道使用Python 从文件读取后回写到同一文件 我的目标是从文件中读取行,在它的结尾处除去空白,然后写回同一个文件中。我尝试了以下代码: with open(filename, 'r+') as f: for i in f: f.write(i.rstrip()+"\n"),python,file,io,python-2.6,Python,File,Io,Python 2.6,这似乎写在文件的末尾,保持文件中的初始数据完好无损。我知道使用f.seek(0)会将指针移回文件的开头,我假设这个解决方案需要这个指针 你能告诉我是否有不同的方法来解决这个问题吗?或者我是在正确的补丁上,只是需要在代码中添加更多的逻辑吗?你的方法的问题是,你需要一个输入流和一个输出流,它们可以指向同一文件中的不同位置。如果要使用f.seek(),则需要在每次读写之后使用f.tell()存储位置。例如: f = open(filename, 'r+') while True: i = f.
f.seek(0)
会将指针移回文件的开头,我假设这个解决方案需要这个指针
你能告诉我是否有不同的方法来解决这个问题吗?或者我是在正确的补丁上,只是需要在代码中添加更多的逻辑吗?你的方法的问题是,你需要一个输入流和一个输出流,它们可以指向同一文件中的不同位置。如果要使用
f.seek()
,则需要在每次读写之后使用f.tell()
存储位置。例如:
f = open(filename, 'r+')
while True:
i = f.readline()
if i == '': break
in = f.tell()
f.seek(out)
f.write(i.rstrip()+"\n")
out = f.tell()
f.seek(in)
但这很混乱,而且容易出错。如果文件不是太大,为什么不把它全部读入内存,然后再写出来呢
in = open(filename, 'r')
lines = in.read()
in.close()
out = open(filename, 'w')
out.write([line.rstrip()+'\n' for line in lines.split('\n')])
out.close()
如果文件太大,无法放入内存,请将行写入临时文件,然后在完成后重命名该文件:
out = open(filename+'.tmp', 'w')
with open(filename, 'r') as f:
for i in f:
out.write(i.rstrip()+"\n")
out.close()
os.rename(filename+'.tmp', filename)
使用临时文件。Python提供了以安全方式创建临时文件的工具。使用以下示例调用:python modify.py target_filename
import tempfile
import sys
def modify_file(filename):
#Create temporary file read/write
t = tempfile.NamedTemporaryFile(mode="r+")
#Open input file read-only
i = open(filename, 'r')
#Copy input file to temporary file, modifying as we go
for line in i:
t.write(line.rstrip()+"\n")
i.close() #Close input file
t.seek(0) #Rewind temporary file to beginning
o = open(filename, "w") #Reopen input file writable
#Overwriting original file with temporary file contents
for line in t:
o.write(line)
t.close() #Close temporary file, will cause it to be deleted
if __name__ == "__main__":
modify_file(sys.argv[1])
此处的参考资料:
您上一个解决方案似乎几乎解决了这个问题,剩下的唯一问题是,我希望更改新文件名,即新文件应替换旧文件。如果我使用上面指定的方法,我会得到
WindowsError:[Error 183]当文件已经存在时无法创建文件
这很简单,只需在关闭旧文件后但在重命名之前删除它:os.remove(filename)
hi我决定使用方法2,将文件内容存储到内存中,但当我执行代码时,会出现错误TypeError:write()参数必须是str,而不是list
,请提供帮助。示例很好,解释也很好。谢谢。我喜欢使用临时文件,即使内存可用。还可以查看tempfile文档中的假脱机临时文件,这提供了一个有趣的折衷方案。