如何使用 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 在我的代码中遇到问题的原因。
'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))
您问题的另一个答案,使用
使用下面显示的代码
$ 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 在我的代码中遇到问题的原因。