从文件中读取后写回同一文件

时间:2013-07-15 04:14:39

标签: python file io python-2.6

我的目标是从文件中读取行,删除文件末尾的空格并写回同一文件。我尝试了以下代码:

with open(filename, 'r+') as f:
    for i in f:
        f.write(i.rstrip()+"\n")

这似乎写在文件的末尾,保持文件中的初始数据不变。我知道使用f.seek(0)将指针返回到文件的开头,我假设这个解决方案需要某种方式。

您能否告知我是否有不同的方法,或者我是否在正确的补丁上只需要在代码中添加更多逻辑?

2 个答案:

答案 0 :(得分:6)

使用临时文件。 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])

此处参考:    http://docs.python.org/2/library/tempfile.html

答案 1 :(得分:3)

您的方法的问题是您需要输入流和输出流,它们可以指向同一文件中的不同位置。如果您想使用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)