首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从文件读取后写回相同的文件

从文件读取后写回相同的文件
EN

Stack Overflow用户
提问于 2013-07-15 12:14:39
回答 2查看 13.5K关注 0票数 10

我的目标是从文件中读取行,去掉末尾的空格,然后写回同一个文件中。我已经尝试了以下代码:

代码语言:javascript
运行
复制
with open(filename, 'r+') as f:
    for i in f:
        f.write(i.rstrip()+"\n")

这似乎是在文件的末尾写入,使文件中的初始数据保持不变。我知道使用f.seek(0)会把指针带回文件的开头,我想这是这个解决方案所需要的。

你能告诉我有没有不同的方法,或者我只是需要在代码中添加更多的逻辑?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-15 12:49:19

使用临时文件。Python提供了以安全的方式创建临时文件的工具。使用python modify.py target_filename调用下面的示例

代码语言:javascript
运行
复制
 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

票数 6
EN

Stack Overflow用户

发布于 2013-07-15 12:47:46

您的方法的问题在于,您需要输入流和输出流,这两个流可以指向同一文件中的不同位置。如果你想使用f.seek(),那么你需要在每次读写之后使用f.tell()来存储位置。例如:

代码语言:javascript
运行
复制
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)

但这是令人困惑的,而且容易出错。如果文件不是太大,为什么不把它全部读到内存中,然后再写出来呢?

代码语言:javascript
运行
复制
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()

如果文件太大,内存无法容纳,则将这些行写入一个临时文件,然后在完成后重命名该文件:

代码语言:javascript
运行
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17646680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档