python - 使用 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()
应该在文件中的这个位置替换它?
解决方案
你的第一个问题是,在做之后......
result = re.search(pattern, file.read())
...您现在位于文件末尾,所以当您这样做时...
for line in file:
...没有更多的行要阅读。正如@bb1 所评论的那样,re.sub
返回一个新字符串并且不会更新任何内容。
假设您想用更新的文本替换文件,如果您将整个文件作为一个字符串读取(您现在位于文件末尾),进行文本替换,重新定位回到开头,则容易得多文件,重写新字符串,然后截断文件中可能出现的任何剩余字符:
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]?'
注意:在原地更新文件时总是存在一些危险。如果由于某种原因计算机在写入操作过程中崩溃,您将丢失原始内容。因此,您可能需要确保在继续之前进行备份。
推荐阅读
- time - 如何将时间转换为数字?
- powershell - 有没有办法优化这个脚本,使它更有效地运行?
- python - 使用添加函数的python列表连接
- javascript - 当列表包含“按钮”元素时,我怎样才能只找到列表的值,但按钮
- sql - 如何查看用户第一次订阅产品的时间?
- pandas - 如何从日期时间序列中构建带有月份的列?
- javascript - 如何在不打开窗口的情况下打开电子应用程序
- java - 如何防止 DialogFragment 调整大小
- facebook-graph-api - 从服务器调用 Facebook API /{user-id}/picture?access_token=xxxxxx 的最佳方式?
- c++ - std::copy 指向易失数据的指针