В Python 3, как использовать Regex для замены строки в файле, когда замещающая строка содержит символы Юникода - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть сценарий Python, который был изначально написан для Python 2, который мне пришлось изменить для 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)

Этот модифицированный скрипт работает нормально, однако он не выводит символ авторского права в юникоде © правильно :

[сборка: AssemblyCopyright ("Copyright ɠ2014-2019")]

1 Ответ

0 голосов
/ 30 апреля 2019

Казалось бы,

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")]

Yay.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...