【问题标题】:Python replace string inside file itself using regular expressionPython使用正则表达式替换文件本身内的字符串
【发布时间】:2020-07-07 09:12:28
【问题描述】:

我在 RedHat Linux 服务器上开发,安装的 Python 版本是 2.6。 我有一个 Python 脚本,它必须替换文件 .sql 中的字符串。每次我运行 Python 脚本时,我都会传递一个不同的参数,该参数必须替换同一个 .sql 文件中最旧的值。

文件 .sql 的内容如下:

SELECT * FROM MY_TABLE WHERE 1=1
AND '1234567890' BETWEEN START_VALUE AND END_VALUE
AND JOB = 'EMPLOYEE';

我不想使用一些临时文件进行详细说明,我应该阅读 .sql 并根据上下文进行修改。

我搜索了其他帖子,但从未找到最终解决方案。 我尝试使用re.sub,但我没有找到如何在.sql 中进行有效替换。

【问题讨论】:

    标签: python regex replace python-2.6


    【解决方案1】:

    我不知道这是否适用于 2.6 - 抱歉。我对 RedHat Server 也一无所知 - 抱歉。而且我对 SQL 不太了解 - 抱歉。这不顺利吧? :o) 但是如果这有帮助的话……

    给定一个包含...的 test.sql 文件

    DECLARE 
    @START_VALUE = 100
    @END_VALUE = 200
    SELECT * FROM MY_TABLE WHERE 1=1
    AND '1234567890' BETWEEN START_VALUE AND END_VALUE
    AND JOB = 'EMPLOYEE';
    

    你可以试试……

    import re
    
    # Read data from file
    with open('test.sql', 'r') as file:
        data = file.read()
    
    print(data)
    
    data = re.sub(r'@END_VALUE = (\d+)', r'@END_VALUE = 555', data)
    print()
    print('After the change...')
    print()
    print(data)
    
    # Write data back 
    with open('test.sql', 'w') as file:
        file.write(data)
    

    输出:

    DECLARE 
    @START_VALUE = 100
    @END_VALUE = 200
    SELECT * FROM MY_TABLE WHERE 1=1
    AND '1234567890' BETWEEN START_VALUE AND END_VALUE
    AND JOB = 'EMPLOYEE';
    
    After the change...
    
    DECLARE 
    @START_VALUE = 100
    @END_VALUE = 555
    SELECT * FROM MY_TABLE WHERE 1=1
    AND '1234567890' BETWEEN START_VALUE AND END_VALUE
    AND JOB = 'EMPLOYEE';
    

    请注意,END_VALUE 从“200”变为“555”。如果您尝试它并出现错误,可能会查看错误部分并找到在 Python 2.x 等中执行此操作的等效方法。

    【讨论】:

    • 对于 MySQL,它可能是 SET @END_VALUE = ... 而不是 DECLARE @END_VALUE = ...
    • 抱歉,我忘了解释我要替换的字符串是“1234567890”,但这也可以。我在您回答时找到了解决方案,但它就像您的一样。使用返回“str”类型的 file.read() 函数读取文件。然后使用 re.sub() 替换字符串,最后用新值重写文件。我的问题是了解逐行读取文件或作为单个块(字符串)读取文件之间的区别。现在我明白了。非常感谢。
    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多