Python не может прочитать файл JSON с кодировкой = 'utf8'

Я не могу прочитать полный текст этого файла JSON:

{
  "messages": [
    {
      "sender_name": "test",
      "timestamp_ms": 1554347140802,
      "content": "Ch\u00c3\u00a0o Anh/Ch\u00e1\u00bb\u008b, Anh/Ch\u00e1\u00bb\u008b vui l\u00c3\u00b2ng \u00c4\u0091\u00e1\u00bb\u0083 l\u00e1\u00ba\u00a1i S\u00e1\u00bb\u0090 \u00c4\u0090I\u00e1\u00bb\u0086N THO\u00e1\u00ba\u00a0I + T\u00c3\u008cNH TR\u00e1\u00ba\u00a0NG B\u00e1\u00bb\u0086NH \u00c4\u0091\u00e1\u00bb\u0083 D\u00c6\u00af\u00e1\u00bb\u00a2C S\u00c4\u00a8 CHUY\u00c3\u008aN M\u00c3\u0094N s\u00e1\u00ba\u00afp x\u00e1\u00ba\u00bfp t\u00c6\u00b0 v\u00e1\u00ba\u00a5n v\u00e1\u00bb\u0081 s\u00e1\u00ba\u00a3n ph\u00e1\u00ba\u00a9m, b\u00e1\u00bb\u0087nh t\u00c3\u00acnh c\u00e1\u00bb\u00a5 th\u00e1\u00bb\u0083 v\u00c3\u00a0 li\u00e1\u00bb\u0087u tr\u00c3\u00acnh ph\u00c3\u00b9 h\u00e1\u00bb\u00a3p cho Anh/Ch\u00e1\u00bb\u008b nh\u00c3\u00a9.",
      "is_geoblocked_for_viewer": false
    },
    {
      "sender_name": "",
      "timestamp_ms": 1554334611125,
      "content": "T\u00c3\u00b4i mu\u00e1\u00bb\u0091n \u00c4\u0091\u00e1\u00ba\u00b7t h\u00c3\u00a0ng",
      "is_geoblocked_for_viewer": false
    },
    {
      "sender_name": "test",
      "timestamp_ms": 1554334610788,
      "content": "Ch\u00c3\u00a0o Musickhc! Ch\u00c3\u00bang t\u00c3\u00b4i c\u00c3\u00b3 th\u00e1\u00bb\u0083 gi\u00c3\u00bap g\u00c3\u00ac cho b\u00e1\u00ba\u00a1n?",
      "is_geoblocked_for_viewer": false
    },
    {
      "sender_name": "test",
      "timestamp_ms": 1554334609955,
      "content": "Customer \u00c4\u0091\u00c3\u00a3 tr\u00e1\u00ba\u00a3 l\u00e1\u00bb\u009di tin nh\u00e1\u00ba\u00afn ch\u00c3\u00a0o m\u00e1\u00bb\u00abng t\u00e1\u00bb\u00b1 \u00c4\u0091\u00e1\u00bb\u0099ng c\u00e1\u00bb\u00a7a b\u00e1\u00ba\u00a1n. \u00c4\u0090\u00e1\u00bb\u0083 thay \u00c4\u0091\u00e1\u00bb\u0095i ho\u00e1\u00ba\u00b7c g\u00e1\u00bb\u00a1 l\u00e1\u00bb\u009di ch\u00c3\u00a0o n\u00c3\u00a0y, h\u00c3\u00a3y truy c\u00e1\u00ba\u00adp ph\u00e1\u00ba\u00a7n C\u00c3\u00a0i \u00c4\u0091\u00e1\u00ba\u00b7t tin nh\u00e1\u00ba\u00afn.",
      "is_geoblocked_for_viewer": false
    }
  ]
}

Я использую этот код:

with open('message_1.json', 'r', encoding='utf-8') as file:
    data = json.loads(file.read())
    print('message', data)
    file.close()

Результат {'messages': [{'sender_name': 'test', 'timestamp_ms': 1554347140802, 'content': 'ChÃ\xa0o Anh/Chá»\x8b, Anh/Chá»\x8b vui lòng Ä\x91á»\x83 lại Sá»\x90 Ä\x90Iá»\x86N THOáº\xa0I + TÃ\x8cNH TRáº\xa0NG Bá»\x86NH Ä\x91á»\x83 DƯỢC SĨ CHUYÃ\x8aN MÃ\x94N sắp xếp tư vấn vá»\x81 sản phẩm, bá»\x87nh tình cụ thá»\x83 vÃ\xa0 liá»\x87u trình phù hợp cho Anh/Chá»\x8b nhé.', 'is_geoblocked_for_viewer': False}, {'sender_name': '', 'timestamp_ms': 1554334611125, 'content': 'Tôi muá»\x91n Ä\x91ặt hÃ\xa0ng', 'is_geoblocked_for_viewer': False}, {'sender_name': 'test', 'timestamp_ms': 1554334610788, 'content': 'ChÃ\xa0o Musickhc! Chúng tôi có thá»\x83 giúp gì cho bạn?', 'is_geoblocked_for_viewer': False}, {'sender_name': 'test', 'timestamp_ms': 1554334609955, 'content': 'Customer Ä\x91ã trả lá»\x9di tin nhắn chÃ\xa0o mừng tá»± Ä\x91á»\x99ng cá»§a bạn. Ä\x90á»\x83 thay Ä\x91á»\x95i hoặc gỡ lá»\x9di chÃ\xa0o nÃ\xa0y, hãy truy cáº\xadp phần CÃ\xa0i Ä\x91ặt tin nhắn.', 'is_geoblocked_for_viewer': False}]}

Может кто-нибудь помочь мне, как прочитать этот файл с помощью utf-8? Спасибо

используйте json.load()

Tanveer 15.07.2024 09:46

Вы прочитали файл. Я не понимаю. Вы даже представляете результат успешного чтения файла. Файл не содержит никаких специальных символов, не так ли? зачем вообще указывать кодировку?

KamilCuk 15.07.2024 09:48

привет @KamilCuk, например, я хочу ChÃ\xa0oChào

famfamfam 15.07.2024 09:49

Это именно то, что содержит ваш файл. Что бы ни создало этот файл, это ошибка, а не ваш код.

deceze 15.07.2024 09:53

На самом деле, если я помещу содержимое и строки в dencode.com/string/unicode-escape, я получу тот же результат, что вы представили. Ваш файл такой, какой он есть.

KamilCuk 15.07.2024 09:55

Пожалуйста, предоставьте минимально воспроизводимый пример, а также ожидаемый результат и тот результат, который вы получили вместо него. Укажите причины, по которым вы считаете, что выходные данные неверны и должны быть другими. В нынешнем виде неясно, что вы здесь считаете проблемой.

Ulrich Eckhardt 15.07.2024 09:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я только что сделал это:

from operator import itemgetter


with open('message_1.json', 'r', encoding='raw_unicode_escape') as file:
    messages = json.loads(file.read().encode('raw_unicode_escape').decode())
    print(messages)
    file.close()

Но не знаю, есть ли что-то лучше

вам не нужно закрывать файл при открытии его с помощью контекстного менеджера (with...), в этом вся суть

folen gateis 15.07.2024 09:59
Ответ принят как подходящий

К сожалению, что бы ни создавало этот файл JSON, оно исказило его, закодировав символы Юникода как UTF-8, а затем закодировав их как отдельные кодовые точки в файле.

Например, à следует писать напрямую как \u00e0, но вместо этого он пишется как \u00c3\u00a0.

Ваш файл JSON поврежден. У вас есть два варианта:

  1. скажите тому, кто или что-то сгенерировало ваш файл JSON, чтобы он выводил правильно сформированный JSON. JSON использует escape-символы UTF-16 для кодирования символов Юникода.
  2. Если вы не можете управлять своим файлом JSON, вам необходимо его исправить. Один из вариантов — пройтись по файлу и исправить каждое сломанное поле. Например:
for message in data["messages"]:
    message["content"] = message["content"].encode("latin1").decode("utf8")

Вам не нужно парсить файл (и ходить по полям), чтобы исправить кодировку, не так ли? Просто читайте, перекодируйте и json.loads.

Jeyekomon 15.07.2024 10:24

В самих строковых литералах файл содержит escape-символы \u00c3. Чтение их с помощью парсера JSON — наиболее надежный способ устранить такие ошибки.

nneonneo 15.07.2024 11:05

Другие вопросы по теме