我如何在文本文件每一行的开头插入一个字符串?我有以下代码:
f = open('./ampo.txt', 'r+')
with open('./ampo.txt') as infile:
for line in infile:
f.insert(0, 'EDF ')
f.close
我遇到了以下错误:
'file' object has no attribute 'insert'
Python内置“电池包括”:
import fileinput
import sys
for line in fileinput.input(['./ampo.txt'], inplace=True):
sys.stdout.write('EDF {l}'.format(l=line))
与已发布的解决方案不同,这种方法还保留了文件权限。
你不能像那样原地修改文件。文件不支持插入。你必须将其全部读取然后再全部写出。
如果你愿意,可以逐行执行此操作。但在这种情况下,您需要写入临时文件,然后替换原始文件。因此,对于足够小的文件,仅一次性完成就更简单了,如下所示:
with open('./ampo.txt', 'r') as f:
lines = f.readlines()
lines = ['EDF '+line for line in lines]
with open('./ampo.txt', 'w') as f:
f.writelines(lines)
[x for y in z]
形式会创建一个新的列表对象,旧的列表对象在新列表构建之前无法进行垃圾回收,因此在某一时刻,原始字符串和修改后的字符串都同时存在于内存中。但是还有(x for y in z)
形式,它创建了一个生成器。生成器是惰性的;它们一次只对一个输入值执行表达式并返回它,因此可以在下一个值被需要之前将其收集起来,它们永远不会同时存在于内存中。在这种情况下,您必须小心不要使其过于惰性,因为文件也支持惰性读取。 - Jan Hudec['EDF ' + line for line in open('./ampo.txt', 'r')]
使用生成器惰性读取文件,但在重写文件之前急切地评估列表以使整个文件保存在内存中。('EDF ' + line for line in f.readlines())
使用急切的读取函数将文件读入内存,然后使用生成器急切地构造修改后的文本。当然,如果你两者都使用生成器,你会严重受伤,因为你会在把所有数据读出来之前就开始重写文件了。 - Jan Hudec对于不太大的文件:
with open('./ampo.txt', 'rb+') as f:
x = f.read()
f.seek(0,0)
f.writelines(('EDF ', x.replace('\n','\nEDF ')))
f.truncate()
f.truncate()
实际上可能并不必要。因为 with 语句应该正确关闭文件,也就是在关闭之前写入 EOF(文件结束标志)。import os
def addsomething(filepath, ss):
if filepath.rfind('.') > filepath.rfind(os.sep):
a,_,c = filepath.rpartition('.')
tempi = a + 'temp.' + c
else:
tempi = filepath + 'temp'
with open(filepath, 'rb') as f, open(tempi,'wb') as g:
g.writelines(ss + line for line in f)
os.remove(filepath)
os.rename(tempi,filepath)
addsomething('./ampo.txt','WZE')
f.truncate()
的目的是什么? - unutbuyield
的函数)以及所有从它们的 __iter__()
方法返回一个生成器对象的东西(例如 file
)。 - Jan Hudec.read()
或.readlines()
这样的版本需要在内存中保留文件内容。此外,如果读取或写入时出现任何错误,您的原始文件将是安全的。from shutil import move
from tempfile import NamedTemporaryFile
filename = './ampo.txt'
tmp = NamedTemporaryFile(delete=False)
with open(filename) as finput:
with open(tmp.name, 'w') as ftmp:
for line in finput:
ftmp.write('EDF '+line)
move(tmp.name, filename)
f = open('./ampo.txt', 'r')
lines = map(lambda l : 'EDF ' + l, f.readlines())
f.close()
f = open('./ampo.txt', 'w')
map(lambda l : f.write(l), lines)
f.close()
map
而应该使用推导式,在另一个情况下使用循环,这不是良好的Python风格。 - Jan Hudec
for
循环逐行迭代读取ampo.txt
中的内容。sys.stdout.write
与print
几乎相同。我之所以选择使用sys.stdout.write
而不是print
,是因为print
会添加额外的换行符,而sys.stdout.write
则不会。由于指定了参数inplace=True
,fileinput
会将原始的ampo.txt
文件移动到一个临时文件中,并将标准输出重定向到名为ampo.txt
的新文件中。然后它复制权限并删除临时文件。还有更多选项,例如保留备份文件,请参见文档以获取更多信息。 - unutbuif fileinput.filelineno() == 3:
根据您所在的行来更改行为。 - unutbu