writing back into the same file after reading from the file

ⅰ亾dé卋堺 提交于 2019-12-05 03:04:52

Use a temporary file. Python provides facilities for creating temporary files in a secure manner. Call example below with: 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])

References here: http://docs.python.org/2/library/tempfile.html

The problem with your approach is that you need both an input stream and an output stream, which can point at different places in the same file. If you want to use f.seek() then you will need to store the position using f.tell() after each read and write. For example:

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)

But that's confusing and prone to errors. If the file isn't too big, why not read it all into memory and then write it back out again?

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()

If the file is too large to fit into memory, then write the lines to a temporary file and then rename the file when you are done:

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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!