如何使用 python 将字符串附加到文件中间的一行?

How do I append a string to a line in the middle of a file using python?

我希望能够打开一个文件,找到一个特定的字符串,然后将一个字符串追加到该特定的行。

到目前为止,我有:

import errno
import glob

path = '/path/to/key_files/*.txt'
SubjectName = 'predetermined'

files = glob.glob(path)
for filename in files:
    try:
        with open(filename, 'r+') as f:
           for line in f:
               if SubjectName in line:
                   print(line)
    except IOError as exc:
        if exc.errno != errno.EISDIR:
            raise

它从包含我指定的字符串的文本文件中打印一行,所以我知道所有代码都可以找到正确的行。我现在想将字符串 ',--processed\n' 添加到定位行的末尾,而不是将其附加到文件的末尾。有办法吗?

是的,有办法做到这一点。找到文件后,将其关闭。然后再次打开它并创建一个新的文本文件。逐行读取输入文件并将每一行写入输出文件。当您到达包含指定字符串的行时,将所需的添加文本附加到该行,然后将其复制到输出文件。然后将输入文件的其余部分复制到输出文件。您可能希望继续检查每一行——您指定的文本可能不止一行。

请注意,您不能只追加到文件的中间。编码字符位于文件中的特定位置,它们不会只是稍微移动以在中间添加更多字符。您几乎肯定需要制作一个新文件。当然,完成后您可以删除输入文件并重命名输出文件。

避免输出文件的唯一方法是目标行末尾有 "blank space",您可以在此处覆盖新文本。这不太可能是真的,除非它是事先计划好的。如果有计划,您可以打开输入文件进行写入,寻找合适的位置,然后写入您的新文本,这将覆盖该位置的任何旧文本。

您可以使用 re.sub。使用 f.read() 读取文件后,您可以使用 f.seek(0) 返回开头并使用 f.write() 写入新内容(您需要使用 r+ 标志打开文件):

file.txt的内容:

Line1
Line2
Line3
Line4

脚本:

import re

SubjectName = 'Line3'

with open('file.txt', 'r+') as f:
    s = f.read()
    new_s = re.sub(r'^(.*{}.*)$'.format(re.escape(SubjectName)), lambda g: g.group(0) + ',--processed', s, flags=re.MULTILINE)
    f.seek(0)
    f.write(new_s)

在 运行 之后 file.txt 包含:

Line1
Line2
Line3,--processed
Line4