我有一个最初为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”)]
答案 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")]
是的