Python: как заменить или удалить все традиционные китайские строки из нескольких файлов из нескольких каталогов

я попытался заменить все китайские строки на "#", но, похоже, не работает

import os,re
path = 'F:\project\test'
files = []
# r=root, d=directories, f = files
for r, d, f in os.walk(path):
    for file in f:
        files.append(os.path.join(r, file))
for file in files:
    with open(file, 'rb') as infile:
        while True:
            content = infile.readline()
            if re.match(r'(.*[u4E00-u9FA5]+)|([u4E00-u9FA5]+.*)', content.decode('utf-8')):
                print(content.decode('utf-8'))
                content.decode('utf-8').replace(content.decode('utf-8'),"#")
                print(content.decode('utf-8'))

я нахожу, что некоторый код может получить китайский или китайский текст, как (но я понятия не имею, использовать)

def find_chinese(str):
    pattern = re.compile(r'[^u4e00-u9fa5]')
    chinese = re.sub(pattern, '', file)
    print(chinese)

def find_unchinese(str):
    pattern = re.compile(r'[u4e00-u9fa5]')
    unchinese = re.sub(pattern, "", file)
    print(unchinese)

str = "2019年1月3日 - python去除空格和换行符的方法 一、去除空格 strip().strip() # ...用replace('',''),后边的串替换掉前边的posted @ 2016-07-18 08:53 ..."
# get unchinese
find_unchinese(str)
# get chinese
find_chinese(str)

я могу заменить английский символ как

import fileinput,re
filename='F:\project\test\test_script.txt'
with fileinput.FileInput(filename, inplace=True, backup='.bak') as file:
    for line in file:
        #pattern = re.compile(r'[^u4e00-u9fa5]')
        #chinese = re.sub(pattern, '', str)
        print(line.replace('aaaa', '#'), end='')
        #print(chinese)

но если текстовый файл включает в себя китайский иероглиф, как

import fileinput,re
filename='F:\project\test\test_script.txt'
with fileinput.FileInput(filename, inplace=True, backup='.bak') as file:
    for line in file:
        pattern = re.compile(r'[^u4e00-u9fa5]')
        chinese = re.sub(pattern, '', str)
        # print(line.replace('aaaa', '#'), end='')
        print(line.replace(chinese, '#'), end='')

консоль покажет UnicodeDecodeError: кодек «cp950» не может декодировать байт 0xa0 в позиции 2: недопустимая многобайтовая последовательность и текстовый файл будут пустыми

Всего 1 ответ


  1. Строки Python являются неизменяемыми, поэтому при замене контента создается новая строка с другим контентом, она не будет работать на месте

  2. в связи с вышеизложенным, как только вы прочитаете строку из файла, она больше не связана, вам нужно в какой-то момент записать ее обратно, если вы хотите, чтобы файл был изменен (если вы не продолжите)

  3. если вы предполагаете, что работаете только с файлами utf-8, вы можете использовать "encoding = 'utf-8'" и убрать флаг b из режима, Python самостоятельно выполнит кодирование и декодирование

  4. content.replace(content, "#") означает, что вы заменяете всю строку одним # , а не только данными CJK

  5. модуль regex поддерживает прямой поиск и замену с использованием статической замены или функции обратного вызова: re.sub (где «sub» означает «заменить»)

  6. также не уверен, почему вы собираете все файлы в большой список файлов и только потом выполняете замены, почему бы не подумать во время итерации os.walk?

  7. обратите внимание, что диапазон, который вы указываете, является только диапазоном BMP CJK, с тех пор было 6 «астральных» расширений (расширения CJK Unified Ideographs от A до F) и 7-й планируется прямо сейчас, не говоря уже о старой «совместимости» диапазон, который находится внутри BMP (U + F900 – U + FAFF)

  8. также не уверен, почему вы не собираетесь подниматься до U + 9FFF, что является фактическим концом диапазона, хотя U + 9FF0 и выше в настоящее время не назначены

Также обратите внимание, что унифицированные диапазоны CJK охватывают все сценарии на ханьском языке, которые включают не только традиционный китайский, но и упрощенный, японский (кандзи), корейский (ханза) и вьетнамский (чоном). И что в юникоде есть дополнительные неунифицированные диапазоны, например, U + 5169 - это, в частности, традиционный китайский символ.


Есть идеи?

10000