Как заменить все символы '0xa0' на '' в связке текстовых файлов? - PullRequest
4 голосов
/ 25 марта 2011

Я пытался массово отредактировать кучу текстовых файлов в utf-8 в python, и эта ошибка продолжает появляться.Есть ли способ заменить их в некоторых скриптах Python или командах Bash?я использовал код:

writer = codecs.open(os.path.join(wrd, 'dict.en'), 'wtr', 'utf-8')
for infile in glob.glob(os.path.join(wrd,'*.txt')):
        print infile
        for line in open(infile):
                writer.write(line.encode('utf-8'))

и получил такие ошибки:

Traceback (most recent call last):
  File "dicting.py", line 30, in <module>
    writer.write(line2.encode('utf-8'))
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 216: unexpected code byte

Ответы [ 3 ]

11 голосов
/ 25 марта 2011

ОК, первая точка: ваш выходной файл настроен на автоматическое кодирование текста, записанного в него, как utf-8, поэтому не включайте явный вызов метода encode('utf-8') при передаче аргументов в метод write().

Итак, первое, что нужно попробовать, это просто использовать в своем внутреннем цикле следующее:

writer.write(line)

Если это не сработает, то проблема почти наверняка в том, что, как отметили другие, вы не декодируете ваш входной файл должным образом.

Делая дикие предположения и предполагая, что ваши входные файлы закодированы в cp1252, вы можете попробовать в качестве быстрого теста следующеевнутренний цикл:

for line in codecs.open(infile, 'r', 'cp1252'):
    writer.write(line)

Незначительная точка: «wtr» - это бессмысленная строка режима (поскольку доступ на запись подразумевает доступ на чтение).Упростите его до 'wt' или даже до 'w'.

3 голосов
/ 25 марта 2011

Вы пропустили какой-то код там?Вы читаете в line, но пытаетесь перекодировать line2.

В любом случае вам придется сообщить Python, что такое кодировка входного файла;если вы не знаете, то вам придется открывать его в сыром виде и выполнять замены без помощи кодека.

0 голосов
/ 25 марта 2011

Пожалуйста, будьте серьезны - простая операция replace () сделает работу:

line = line.replace(chr(0xa0), '')

Кроме того, конструкторы codecs.open () поддерживают параметр 'errors' для обработки ошибки преобразования. Пожалуйста, прочитайте (себя).

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