我的目标是从文件中读取行,去掉它末尾的空格并写回同一个文件。我尝试了以下代码:
with open(filename, 'r+') as f:
for i in f:
f.write(i.rstrip()+"\n")
这似乎写在文件的末尾,使文件中的初始数据保持不变。我知道 usingf.seek(0)
会将指针带回文件的开头,我假设此解决方案会以某种方式需要它。
您能否告知是否有不同的方法,或者我是否在正确的补丁上只需要在代码中添加更多逻辑?
我的目标是从文件中读取行,去掉它末尾的空格并写回同一个文件。我尝试了以下代码:
with open(filename, 'r+') as f:
for i in f:
f.write(i.rstrip()+"\n")
这似乎写在文件的末尾,使文件中的初始数据保持不变。我知道 usingf.seek(0)
会将指针带回文件的开头,我假设此解决方案会以某种方式需要它。
您能否告知是否有不同的方法,或者我是否在正确的补丁上只需要在代码中添加更多逻辑?
使用临时文件。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
您的方法的问题是您需要输入流和输出流,它们可以指向同一文件中的不同位置。如果要使用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)