2015-08-08 10 views
0

Ниже часть моего кода, который дает мне ошибку ..UnicodeDecodeError чтение файла JSON

# get all browser products 
raw_json_file = open(script_dir + "raw_json.js", 'r') 
raw_json = raw_json_file.read() 
all_str = raw_json[ raw_json.find("{"): ] 
all_obj = json.loads(all_str) 
browser_products = all_obj["categories"]["6"]["products"] 

ошибка я получаю здесь, как показано ниже:

C:\Python34>python parse.py 8.3.4 
argument is 8.3.4 
Traceback (most recent call last): 
    File "parse.py", line 42, in <module> 
    raw_json = raw_json_file.read() 
    File "C:\Python34\lib\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 563011: character maps to <undefined> 

Пожалуйста, дайте мне знать, как для решения этой ошибки.

+0

Вы создали свой JSON, используя правильное отображение. JSON <==> Python, вот так. объект == ДИКТ, массив == список, строка == юникода, число (целое) == INT долго номер (реальный) == поплавок, правда == Правда, ложь == false, null == Нет. – Gatunox

+0

'js' - это javascript. 'json' - это json-файл. – ytpillai

ответ

2

При использовании open() в Python 3, по умолчанию он будет считать, что файл закодирован в некоторой системе по умолчанию, которые, как представляется, в вашем случае, это Windows, cp1252 кодирования. Возможно, файл фактически закодирован каким-то другим способом, например очень распространенным UTF-8.
Вы можете попробовать

raw_json_file = open(script_dir + "raw_json.js", 'r', encoding='utf8') 

, чтобы увидеть, если это так, но на самом деле вы должны спросить, кто предоставил файл, какую кодировку они использовали.

0

Лучший способ сделать это - попробовать кодирование и декодирование до utf-8.

# get all browser products 
raw_json_file = open(script_dir + "raw_json.js", 'r') 
raw_json = bytes(raw_json_file.read()).decode() 
all_str = raw_json[ raw_json.find("{"): ] 
all_obj = json.loads(all_str) 
browser_products = all_obj["categories"]["6"]["products"] 
#Do this to the strings you get from the JSON file directly. Then, use them as needed. 

компьютеры имеют разные коды и ценности, которые они могут дать для некоторых персонажей, один из этих кодировок является unicode. Тем не менее, это не обычные строки, поэтому вам нужно их преобразовать в Python перед их использованием. Попробуйте посмотреть This Article для получения дополнительной информации.

Кроме того, ваш файл не является файлом JSON, а является языковым файлом языка JavaScript, который используется для разработки веб-сайтов. Пожалуйста, подтвердите правильность вашего файла, если вы его не сделали. Если вы сами создали файл, вам не нужно беспокоиться. Изменение расширения - это просто способ сообщить компьютеру, какую программу использовать для открытия файла.

ХРАНИТЬ В ВИДЕ

Когда я сделал decode(), он автоматически декодирует из utf-8 характеристики. Если вы не знаете, что такое кодировка файла, попробуйте установить модуль chardet с пипсом и ознакомьтесь с руководством по использованию chardet documentation. Как только вы узнаете (иногда, если ваш файл использует разные наборы символов, chardet не будет работать, и вам придется изменить все кодировки на единую кодировку), добавьте его как строковый аргумент в decode().

Извините, если все это кажется ошеломляющим, но есть много людей, у которых была эта ошибка. Просто зайдите в Google и найдите решение :).