在每行的开头插入字符串

时间:2011-10-03 09:59:36

标签: python string file

如何在文本文件的每一行的开头插入一个字符串,我有以下代码:

f = open('./ampo.txt', 'r+')
with open('./ampo.txt') as infile:
    for line in infile:
        f.insert(0, 'EDF ')
f.close

我收到以下错误:

“'file'对象没有属性'insert'”

请注意,我是一个完整的编程n00b。

5 个答案:

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