Python: проблема Unicode - PullRequest
       1

Python: проблема Unicode

8 голосов
/ 19 января 2011

Я пытаюсь декодировать строку, взятую из файла:

file = open ("./Downloads/lamp-post.csv", 'r')
data = file.readlines()
data[0]

'\ xff \ xfeK \ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ x00 \ t \ x00C\ x00o \ x00m \ x00p \ x00e \ x00t \ x00i \ x00t \ x00i \ x00o \ x00n \ x00 \ t \ x00G \ x00l \ x00o \ x00b \ x00a \ x00l \ x00 \ x00M \ x00o \ x00n \ x00t \ x00h \ x00l\ x00y \ x00 \ x00S \ x00e \ x00a \ x00r \ x00c \ x00h \ x00e \ x00s \ x00 \ t \ x00D \ x00e \ x00c \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00N \ x00o \ x00v\ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00O \ x00c \ x00t \ x00 \ x002 \ x001 \ x001 \ x000 \ x00 \ t \ x00S \ x00e \ x00p \ x00 \ x002 \ x000 \ x001 \ x000\ x00 \ t \ x00A \ x00u \ x00g \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00u \ x00l \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00u \ x00n\ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00M \ x00a \ x00y \ x00 \ x002 \ x001 \ x001 \ x000 \ x00 \ t \ x00A \ x00p \ x00r \ x00 \ x002 \ x000 \ x001 \ x000\ x00 \ t \ x00M \ x00a \ x00r \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00F \ x00e \ x00b \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00a \ x00n\ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00A \ x00d \ x00 \ x00s \ x00h \ x00a \ x00r \ x00e \ x00 \ t \ x00S \ x00e \ x00a \ x00r \ x00c \ x00h \ x00 \ x00s\ x00h \ x00a \ x00r \ x00e \ x00 \ т \ x00E \ x00s \ x00t \ x00i \ x00m \ х00a \ x00t \ x00e \ x00d \ x00 \ x00A \ x00v \ x00g \ x00. \ X00 \ x00C \ x00P \ x00C \ x00 \ t \ x00E \ x00x \ x00t \ x00r \ x00a \ x00c \ x00t \ x00e \ x00d \ x00\ x00F \ x00r \ x00o \ x00m \ x00 \ x00W \ x00e \ x00b \ x00 \ x00P \ x00a \ x00g \ x00e \ x00 \ t \ x00L \ x00o \ x00c \ x00a \ x00l \ x00 \ x00M \ x00o \ x00n \ x00t\ x00h \ x00l \ x00y \ x00 \ x00S \ x00e \ x00a \ x00r \ x00c \ x00h \ x00e \ x00s \ x00 \ n '

Добавление игнорирования не очень помогает ...:

В [69]: данные [2], [69]: u 'u6700 \ u7200 \ u6400 \ u6e00 \ u6c00 \ u6100 \ u6d00 \ u7000 \ u2000 \ u7000 \u6f00 \ u7300 \ u7400 \ u0900 \ u3000 \ u2e00 \ u3900 \ U3400 \ u0900 \ u3800 \ u3800 \ u3000 \ u0900 \ u2d00 \ u0900 \ u3300 \ u3200 \ u3000 \ u0900 \ u3300 \ u3900 \ u3000 \ u0900 \ u3300 \ u3900 \u3000 \ u0900 \ U3400 \ u3800 \ u3000 \ u0900 \ U3500 \ u3900 \ u3000 \ u0900 \ U3500 \ u3900 \ u3000 \ u0900 \ u3700 \ u3200 \ u3000 \ u0900 \ u3700 \ u3200 \ u3000 \ u0900 \ u3300 \ u3900 \ u3000 \u0900 \ u3300 \ u3200 \ u3000 \ u0900 \ u3200 \ u3600 \ u3000 \ u0900 \ u2d00 \ u0900 \ u2d00 \ u0900 \ ua300 \ u3200 \ u2e00 \ u3100 \ u3800 \ u0900 \ u2d00 \ u0900 \ U3400 \ u3800 \ u3000 \ u0a00'

В [70]: data [2] .decode ("utf-8", "replace") --------------------------------------------------------------------------- Traceback (последний вызов был последним)

/ Users / oleg / in ()

/opt / local / lib / python2.5 / encodings / utf_8.py в декодировании (ввод, ошибки) 14 15 def декодирование (ввод, ошибки = 'строгие'): ---> 16 возвращают codecs.utf_8_decode (ввод, ошибки,True) 17 18 класс IncrementalEncoder (codecs.IncrementalEncoder):

: кодек «ascii» не может кодировать символы в позиции 0–87: порядковый номер не в диапазоне (128)

In [71]:

Ответы [ 3 ]

15 голосов
/ 19 января 2011

Это похоже на данные UTF-16. Так что попробуйте

data[0].rstrip("\n").decode("utf-16")

Изменить (для вашего обновления): Попробуйте декодировать весь файл сразу, то есть

data = open(...).read()
data.decode("utf-16")

Проблема заключается в том, что разрывы строк в UTF-16 являются "\ n \ x00", но использование readlines() приведет к разбиению на "\ n", оставляя символ "\ x00" для следующей строки.

6 голосов
/ 13 февраля 2011

Этот файл является файлом в кодировке UTF-16-LE с исходной спецификацией.

import codecs

fp= codecs.open("a", "r", "utf-16")
lines= fp.readlines()
3 голосов
/ 19 января 2011

РЕДАКТИРОВАТЬ

Поскольку вы опубликовали 2.7, это решение 2.7:

file = open("./Downloads/lamp-post.csv", "r")
data = [line.decode("utf-16", "replace") for line in file]

Игнорирование не кодируемых символов:

file = open("./Downloads/lamp-post.csv", "r")
data = [line.decode("utf-16", "ignore") for line in file]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...