#python #html #file #runtime-error #writing
#python
Вопрос:
Получение следующей ошибки при попытке записать значение ключа словаря, содержащее теги HTML, в текстовый файл.
Traceback (most recent call last):
File "/Users/jackboland/PycharmProjects/NLTK_example/JsonToTxt.py", line 11, in <module>
data = json.load(json_data)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 293, in load
return loads(fp.read(),
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 10: invalid start byte
У меня есть набор файлов JSON. Я успешно извлекаю эти данные в словарь Python. Затем оттуда я определяю ключ словаря, значение которого является самым длинным, и извлекаю это значение в текстовый файл. Код работает для всех файлов JSON, самым длинным значением ключа словаря которых является строка. Он выдает указанную выше ошибку для файлов, самым длинным значением ключа словаря которых является содержимое html.
with open(path file) as json_data:
data = json.load(json_data)
for value in data.values(): # gets the value of each dictionary key
value = str(value) # converts the value of each dictionary key to a string enabling counting total characters
vLength = len(value) # calculates the length of each value in every dictionary key to enable identifying only the longest of the key values
if vLength > 100: # if the length of a value is over 200 characters, it prints that, this insures capturing the opinion text no matter what dictionary key it is in
f = open(newpath file[:-5] ".txt", 'w ')
f.write(value)
f.close()
Значения ключей словаря, которые являются строками, анализируются из словаря в текстовый файл. В текстовый файл не записываются только значения ключей словаря, содержащие html.
Комментарии:
1. На каком языке ваш JSON? Похоже, у вас есть символ, который не является UTF-8. Вы можете попробовать кодирование, а затем декодирование в одной строке.
2. Будучи относительно новым для JSON, я не могу сказать вам, на каком языке находится JSON. Я вижу только, что значения в ключах словаря, которые не содержат html, экспортируются в мой текстовый файл без инцидентов, а значения, содержащие теги html, приводят к пустым текстовым файлам.
3. Можете ли вы показать образец json, который вы пытаетесь прочитать / записать?
4. Пример значения ключа словаря JSON с тегами HTML, вызывающими ошибку. { «html_columbia»: «<p><center> МНЕНИЕ </center>n<strong>{amp;#182; 1}</ сильный> Апеллянт Стэнли Э. Хофф обжалует свой приговор за нарушение порядка гражданской защиты в муниципальном суде округа Фэрфилд. Соответствующие факты, приводящие к этому обращению, заключаются в следующем. </p>n<p> <strong>{amp;#182; 2}</ strong> </p>», «extracted_by_ocr»: false, «opinions_cited»: [ » courtlistener.com:80/api/rest/v3/мнения/3712642 »
Ответ №1:
Python пытается преобразовать байтовый массив в строку Юникода. Когда он пытается это сделать, он обнаруживает последовательность байтов, которая не разрешена в строках в кодировке utf-8 (здесь в 0xc0 в позиции 10).
Попробуйте прочитать файл в двоичном формате, чтобы содержимое файла оставалось в виде байтов.
with open(path file, 'rb') as json_data:
//rest of the code
Если это не сработает, вручную укажите форматы кодирования.
Пример :
open(path file, encoding="utf-8") as json_data
//rest of the code
Вы можете получить различные форматы кодирования здесь.
Комментарии:
1. Спасибо за эти предложения, к сожалению, оба варианта привели к одной и той же ошибке.
2. encoding=»utf-8″ был только для примера. Попробуйте использовать другие форматы кодирования, указанные в ссылке, соответствующей вашему формату файла. docs.python.org/2.4/lib/standard-encodings.html