【问题标题】:How do I append a string to a line in the middle of a file using python?如何使用python将字符串附加到文件中间的一行?
【发布时间】:2019-06-18 18:20:39
【问题描述】:

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

到目前为止,我有:

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' 添加到定位行的末尾,而不是将其附加到文件的最后。有没有办法做到这一点?

【问题讨论】:

标签: python string append text-files line


【解决方案1】:

您可以使用re.sub。读取带有f.read() 的文件后,您可以使用see 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

【讨论】:

  • 成功了,谢谢!你介意多解释一下你为 new_s 做了什么吗?
  • @LouiseCullen 我使用正则表达式将旧字符串替换为新字符串 - 在本例中为 Line3Line3;--processed。关键是将标志设置为re.MULTILINE 以使^$ 符号适用于每一行。 regex101.com/r/bLvLNa/1
【解决方案2】:

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

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

避免输出文件的唯一方法是在目标行的末尾有“空格”,您可以在其中覆盖新文本。这不太可能是真的,除非它是提前计划好的。如果已计划好,您可以打开输入文件进行写入,寻找合适的位置,然后写入您的新文本,该文本将覆盖该位置的任何旧文本。

【讨论】:

    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 2018-04-26
    • 2011-05-25
    • 2023-03-22
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多