python: как заменить или удалить все традиционные китайские строки из нескольких файлов из нескольких каталогов - PullRequest
0 голосов
/ 10 февраля 2020

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

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)

Я могу заменить английский sh символ, например,

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)

, но если txt-файл содержит китайский символ, например

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' код c не может декодировать байт 0xa0 в позиции 2: недопустимая многобайтовая последовательность и текстовый файл будут пустыми

1 Ответ

0 голосов
/ 10 февраля 2020
  1. python строки неизменяемые , поэтому при замене содержимого создается новая строка с другим содержимым, которая не будет работать на месте

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

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

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

  5. модуль регулярных выражений поддерживает прямой поиск и замену с использованием либо замены * stati c, либо функции обратного вызова: 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 - это , в частности - традиционный китайский символ.

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