使用 re 替换文件中的行
Replace line in file using re
为什么我的代码不能正常工作?
我正在尝试使用 re
模块替换文件中的一行:
import re
file = open("php.ini", "r+")
pattern = r'post_max_size = [0-9]'
result = re.search(pattern, file.read())
for line in file:
re.sub(pattern, "post_max_size = 1G", file.read())
file.close()
print(result)
我已经使用 fileimport
库完成了此操作,但不是这样。为什么它不能 运行 在模式打印好的结果时正确 re.sub()
应该在文件的这个地方替换它?
尝试在正则表达式中使用分组括号:
pattern = re.compile(r'(post_max_size\s=\s[0-9])')
pattern.sub("post_max_size = 1G", file.read())
你的第一个问题是在做了...
result = re.search(pattern, file.read())
...您现在位于文件末尾,所以当您这样做时...
for line in file:
...没有更多行可读。正如@bb1 所评论的那样,re.sub
return 一个新字符串并且不会更新任何内容。
假设你想用更新的文本替换文件,如果你将整个文件作为一个字符串读入(你现在位于文件末尾),进行文本替换,重新位置回到文件的开头,重新写入新字符串,然后截断文件中可能是任何剩余字符的内容:
import re
pattern = r'post_max_size = [0-9]'
with open("php.ini", "r+") as file:
text = file.read()
text = re.sub(pattern, "post_max_size = 1G", text)
file.seek(0, 0) # seek to beginning
file.write(text)
file.truncate() # get rid of any trailing characters
但我质疑你的 pattern
正则表达式。如果输入有以下任何一项怎么办?
post_max_size = 1234
post_max_size=1234k
post_max_size = 1234G
您只匹配了一个个数字。也许你的模式应该是:
pattern = r'post_max_size\s*=\s*[0-9]+[kKgG]?'
注意:就地更新文件时总会有一些危险。如果由于某种原因计算机在写入操作过程中崩溃,您将丢失原始内容。因此,您可能希望在继续之前确保有一个备份。
更好的正则表达式将是解决此问题的下一个好方法。非常感谢,现在很简单。
我将使用此提示修改脚本,因为重要的是不要丢失生产服务器上的数据。
为什么我的代码不能正常工作?
我正在尝试使用 re
模块替换文件中的一行:
import re
file = open("php.ini", "r+")
pattern = r'post_max_size = [0-9]'
result = re.search(pattern, file.read())
for line in file:
re.sub(pattern, "post_max_size = 1G", file.read())
file.close()
print(result)
我已经使用 fileimport
库完成了此操作,但不是这样。为什么它不能 运行 在模式打印好的结果时正确 re.sub()
应该在文件的这个地方替换它?
尝试在正则表达式中使用分组括号:
pattern = re.compile(r'(post_max_size\s=\s[0-9])')
pattern.sub("post_max_size = 1G", file.read())
你的第一个问题是在做了...
result = re.search(pattern, file.read())
...您现在位于文件末尾,所以当您这样做时...
for line in file:
...没有更多行可读。正如@bb1 所评论的那样,re.sub
return 一个新字符串并且不会更新任何内容。
假设你想用更新的文本替换文件,如果你将整个文件作为一个字符串读入(你现在位于文件末尾),进行文本替换,重新位置回到文件的开头,重新写入新字符串,然后截断文件中可能是任何剩余字符的内容:
import re
pattern = r'post_max_size = [0-9]'
with open("php.ini", "r+") as file:
text = file.read()
text = re.sub(pattern, "post_max_size = 1G", text)
file.seek(0, 0) # seek to beginning
file.write(text)
file.truncate() # get rid of any trailing characters
但我质疑你的 pattern
正则表达式。如果输入有以下任何一项怎么办?
post_max_size = 1234
post_max_size=1234k
post_max_size = 1234G
您只匹配了一个个数字。也许你的模式应该是:
pattern = r'post_max_size\s*=\s*[0-9]+[kKgG]?'
注意:就地更新文件时总会有一些危险。如果由于某种原因计算机在写入操作过程中崩溃,您将丢失原始内容。因此,您可能希望在继续之前确保有一个备份。
更好的正则表达式将是解决此问题的下一个好方法。非常感谢,现在很简单。 我将使用此提示修改脚本,因为重要的是不要丢失生产服务器上的数据。