如何使用 Python 脚本将特定字符串插入文件中特定行的特定位置?

How to insert a specific string into a specific location of a specific line in a file using a Python script?

'file.txt' 中有这样一行:

memcpy(buffer, "", 64)

我想编写一个 Python 脚本来读取此 file.txt 并在其中找到这一行。然后,它继续在该行的两个引号 ("") 之间插入一个特定的字符串(存储在变量 'data' 中)。

例如,如果变量 data 包含值 'foo bar',则该行将被 Python 脚本修改为:

memcpy(buffer, "foo bar", 64)

这是我尝试过的:

data = "foo bar"

with open('file.txt') as in_file:
    in_buffer = in_file.readlines()

with open('new.txt', "w") as out_file:
    for line in in_buffer:
        if line == 'memcpy(buffer, "", 64)':
            out_file.write("memcpy(buffer, \"data\", 64)")
        else:
            out_file.write(line)

它没有用,因为它在 new.txt 中创建了完全相同的文件副本,而没有进行任何修改。

with open(filename) as in_file:
    in_buffer = in_file.readlines()

with open(filename, "w") as out_file:
    for line in in_buffer:
        if condition:
            out_file.write("something else")
        else:
            out_file.write(line)

请使用

if line == 'memcpy(buffer, "", 64)\n':
     out_file.write('memcpy(buffer, "'+data+'", 64)\n')

而不是你的

if line == 'memcpy(buffer, "", 64)':
        out_file.write("memcpy(buffer, \"data\", 64)")

因为 readlines() 方法不去除换行符。

Post Scriptum 请注意,不仅要重写条件,而且 if 正文也需要重新设计,您的版本会写

memcpy(buffer, "data", 64)

到输出文件。

此代码将条件部分添加到喇叭代码中。 使用 re modules 子函数替换匹配的字符串。

import re

filename = "file.txt"
regex = re.compile(r'(memcpy\s*\(\s*buffer\s*,\s*")\s*("\s*,\s*64\s*)')
with open(filename) as in_file:
    in_buffer = in_file.readlines()

data = "foo bar"
with open(filename, "w") as out_file:
    for line in in_buffer:
        out_file.write(regex.sub(r'\g<1>'+data+'\g<2>', line))

您问题的另一个答案,使用 by Peter Wood

中的建议

使用下面显示的代码

$ cat mod_memcpy.py
from fileinput import input
data = "Papa Smurf"
for line in input(inline=1, backup=".bak"):
    if line != 'memcpy(buffer, "", 64)\n':
        print line, # << note the comma
    else:
       print 'memcpy(buffer, "'+data+'", 64)'

通过以下方式

$ python2 mod_memcpy.py file.txt

你会得到一个备份文件,file.bak file.txt.bak 和修改后的 file.txt

memcpy(buffer, "", 64)

替换为

memcpy(buffer, "Papa Smurf", 64)

fileinput 的参考文档是 here (Python 2) or here (Python3)。

我想补充一点,fileinput 模块 是此类问题的答案,即,修改一个文件或一系列文件。


附录 以下是从 shell

$ cat c.py
from __future__ import print_function
from fileinput import input
for line in input(inplace=True, backup='.bak'):
    print("00", line, end="")
$ cat dele.txt # the real file is a bit longer, hence the ellipsis
Company ABC-GH Date:31.12.2012
financial statement:4
...
$ python2 c.py dele.txt
$ cat dele.txt
00 Company ABC-GH Date:31.12.2012
00 financial statement:4
...
$ mv dele.txt.bak dele.txt
$ python3 c.py dele.txt
$ cat dele.txt
00 Company ABC-GH Date:31.12.2012
00 financial statement:4
...
$ mv dele.txt.bak dele.txt

似乎是代码的相关部分,即

for line in input(inline=1, backup=".bak"):

与 Python 2.7 和 Python 3.4 完全相同,我不得不承认我不明白这是 OP 在我的代码中遇到问题的原因。