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文档中的假脱机临时文件,这提供了一个有趣的折衷方案。