如何在文本文件的每一行的开头插入一个字符串,我有以下代码:
f = open('./ampo.txt', 'r+')
with open('./ampo.txt') as infile:
for line in infile:
f.insert(0, 'EDF ')
f.close
我收到以下错误:
“'file'对象没有属性'insert'”
请注意,我是一个完整的编程n00b。
答案 0 :(得分:21)
Python附带batteries included:
import fileinput
import sys
for line in fileinput.input(['./ampo.txt'], inplace=True):
sys.stdout.write('EDF {l}'.format(l=line))
与已发布的解决方案不同,这也保留了文件权限。
答案 1 :(得分:7)
您无法像这样修改文件。文件不支持插入。你必须全部阅读,然后再写出来。
如果您愿意,可以逐行执行此操作。但在这种情况下,您需要写入临时文件,然后替换原始文件。因此,对于足够小的文件,这样做更简单:
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)
答案 2 :(得分:0)
对于文件不太大:
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(文件末尾)。
这就是我在例子中观察到的
但我很谨慎:我认为最好还是把这条指令放好。对于内容减少时,with语句不会写入EOF以正确关闭文件,而不是前一个初始EOF,因此尾随的初始字符仍保留在文件中。
因此,如果with语句在内容减少时不写EOF,为什么在内容增加时会写它?
对于大文件,要避免一次将文件的所有内容放入RAM:
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')
答案 3 :(得分:0)
这是一个解决方案,您可以写入临时文件并将其移动到位。如果您要重写的文件非常大,您可能更喜欢这个版本,因为它避免将文件内容保留在内存中,因为涉及.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)
答案 4 :(得分:-1)
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()