Python Encoding \ Decoding для записи в текстовый файл - PullRequest
1 голос
/ 27 марта 2012

Я честно потратил много времени на это, и это медленно убивает меня.Я удалил содержимое из PDF и сохранил его в массиве.Теперь я пытаюсь извлечь его из массива и записать в текстовый файл.Тем не менее, мне кажется, что я не могу этого добиться из-за проблем с кодированием.

allTheNTMs.append(contentRaw[s1:].encode("utf-8"))
for a in range(len(allTheNTMs)):
        kmlDescription = allTheNTMs[a]
        print kmlDescription #this prints out fine
        outputFile.write(kmlDescription)

Я получаю ошибку "unicodedecodeerror: кодек ascii не может декодировать байт 0xc2 в позиции 213: ординалне в диапазоне (128).

Сейчас я просто бездельничаю, но я попробовал все способы заставить этот материал написать.

outputFile.write(kmlDescription).decode('utf-8')          

Пожалуйста, прости меняесли это просто, я все еще изучаю Python (2.7).

Cheers!

EDIT1: Пример данных выглядит примерно так:

Chart 3686 (plan, Morehead City) [ previous update 4997/11 ] NAD83 DATUM
Insert the accompanying block, showing amendments to coastline,
depths and dolphins, centred on: 34° 41´·19N., 76° 40´·43W.
Delete R 34° 43´·16N., 76° 41´·64W.

Когда ядобавить тип печати (raw), я получаю

Редактировать 2: Когда я просто пытаюсь записать данные, я получаю оригинальное сообщение об ошибке (кодек ascii не может декодировать байт ...)

Я проверю предложенную тему и видео. Спасибо, ребята!

Редактировать 3: я использую Python 2.7

Редактировать 4: agf ударил по ногте в голове в комментариях нижекогда он (и) заметил, что я выполняю двойное кодированиеКороль и выдал то же сообщение об ошибке, которое было первоначально выброшено.Что-то вроде:

text = "Here's a string, but imagine it has some weird symbols and whatnot in it - apparently latin-1"
textEncoded = text.encode('utf-8')
textEncodedX2 = textEncoded.encode('utf-8')
outputfile.write(textEncoded) #Works!
outputfile.write(textEncodedX2) #failed

Как только я понял, что пытаюсь выполнить двойное кодирование, решение было следующим:

allTheNTMs.append(contentRaw[s1:].encode("utf-8"))
for a in range(len(allTheNTMs)):
    kmlDescription = allTheNTMs[a]
    kmlDescriptionDecode = kmlDescription.decode("latin-1")
    outputFile.write(kmlDescriptionDecode)

Это работает сейчас, и я очень признателен за вашу помощь!!

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Я предполагаю, что открываемый вами выходной файл был открыт с помощью кодека latin1 или даже utf-8, поэтому вы не можете записать в него закодированные данные utf-8, поскольку он пытается преобразовать их, в противном случае обычно В открытом файле можно написать любую произвольную строку данных, вот пример, воссоздающий похожую ошибку

u = u'सच्चिदानन्द हीरानन्द वात्स्यायन '
s = u.encode('utf-8')
f = codecs.open('del.text', 'wb',encoding='latin1')
f.write(s)

Выход:

Traceback (most recent call last):
  File "/usr/lib/wingide4.1/src/debug/tserver/_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "/usr/lib/python2.7/codecs.py", line 691, in write
    return self.writer.write(data)
  File "/usr/lib/python2.7/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)

Решение :

это будет работать, если вы не установите кодек

f = open('del.txt', 'wb') 
f.write(s)

другой вариант - напрямую записать в файл без кодирования строк Юникода, если выходной файл был открыт с правильным кодеком, например,

f = codecs.open('del.text', 'wb',encoding='utf-8')
f.write(u)
1 голос
/ 27 марта 2012

Похоже, что ваше сообщение об ошибке не относится к какому-либо синтаксису Python, но на самом деле вы пытаетесь декодировать шестнадцатеричное значение, которое не имеет эквивалента в UTF-8.

HEX 0xc2представляется латинским символом - заглавная буква A с акцентом в верхней части.Поэтому вместо использования "allTheNTMs.append (contentRaw [s1:]. Encode (" utf-8 "))" попробуйте: -

allTheNTMs.append(contentRaw[s1:].encode("latin-1"))

Я неэксперт в Python, так что это может не сработать, но может показаться, что вы пытаетесь закодировать латинский символ.Учитывая полученное вами сообщение об ошибке, может показаться, что при попытке кодирования в UTF-8 Python просматривает только первые 128 записей, учитывая, что ваша ошибка указывает на то, что запись "0Xc2" выходит за пределы диапазона, который действительно естьиз первых 128 записей UTF-8.

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