在每行开头插入字符串

12 投票
5 回答
23155 浏览
提问于 2025-04-17 03:34

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

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'

5 个回答

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,这样文件就没有正确关闭,之前的内容可能会留在文件里。
所以,如果在内容减少时 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')
8

你不能直接在文件里修改内容。文件不支持插入操作。你需要先把文件的内容全部读出来,然后再把修改后的内容写回去。

如果你愿意,也可以一行一行地处理。但是这样的话,你需要先写到一个临时文件里,然后再用这个临时文件替换掉原来的文件。所以,对于比较小的文件,直接一次性处理会更简单一些,像这样:

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)
28

Python自带了一些很方便的功能:

import fileinput
import sys

for line in fileinput.input(['./ampo.txt'], inplace=True):
    sys.stdout.write('EDF {l}'.format(l=line))

跟之前发布的解决方案不同,这个方法还能保留文件的权限设置。

撰写回答