在Python 3中,当替换字符串包含Unicode字符时,如何使用Regex替换文件中的字符串

时间:2019-04-30 00:59:34

标签: regex python-3.x

我有一个最初为Python 2编写的python脚本,但我不得不为Python 3更改。

目的是浏览目录以查找给定类型的文件,并替换这些文件中包含版权信息的所有行。

import fileinput
import datetime
import sys
import re
import os
year = datetime.datetime.now().year
assemblyInfoPattern = re.compile(r"^\[assembly:\sAssemblyCopyright\(\"Copyright.*\]$")

for root, dirs, files in os.walk('.') :
    for file in files :
        if file == 'AssemblyInfo.cs' :
            print (f'Checking {root}\\AssemblyInfo.cs')
            for line in fileinput.input(os.path.join(root, file), inplace=True):
                replacementString = '[assembly: AssemblyCopyright("Copyright © 2014-' + str(year) + '")]'
                outputLine = assemblyInfoPattern.sub(replacementString, line)
                sys.stdout.write(outputLine)

此修改后的脚本可以正常工作,但是它没有正确输出unicode版权符号©

  

[assembly:AssemblyCopyright(“版权ɠ2014-2019”)]

1 个答案:

答案 0 :(得分:0)

看来

fileinput.input(file, inplace=True)

不允许您指定编码,这是我问题的根源,因为我的目标文件需要指定utf8编码。

我能够以更详细的方式重写代码,从而允许我改为使用:

with open(file, 'r', encoding='utf8') as f:

...这使我可以指定编码。

新脚本:

import fileinput
import datetime
import sys
import re
import os
year = str(datetime.datetime.now().year)
assemblyInfoPattern = re.compile(r"^\[assembly:\sAssemblyCopyright\(\"Copyright.*\]$")

for root, dirs, files in os.walk('.') :
    for file in files :
        if file == 'AssemblyInfo.cs' :
            print (f'Checking {root}\\AssemblyInfo.cs')
            outputFile = ""
            with open(os.path.join(root, file), 'r', encoding='utf8') as f:
                for line in f.readlines() :
                    replacementString = '[assembly: AssemblyCopyright("Copyright © 2014-' + year + '")]'
                    outputLine = assemblyInfoPattern.sub(replacementString, line)
                    outputFile = outputFile + outputLine
            with open(os.path.join(root, file), 'w', encoding='utf8') as f:
                f.write(outputFile)

现在我的输出文件包含正确的行:

[assembly: AssemblyCopyright("Copyright © 2014-2019")]

是的