Продолжайте получать ошибки при чтении файла Json с Python - PullRequest
0 голосов
/ 21 июня 2020

У меня есть файл Json вроде такого:

{"id": "53f43a7bdabfaeb22f497fb8", "name": "Nayara Fernanda Monte", "h_index": 0, "n_pubs": 1, "tags": [], "pubs": [{"i": "53e9bc79b7602d97048f8888", "r": 2}, {"i": "56d8971cdabfae2eee185494", "r": 2}], "n_citation": 0, "orgs": [""]}
{"id": "53f43f5adabfaedf435b9bdf", "name": "J\u00f6rg B\u00e4ssmann", "h_index": 0, "n_pubs": 1, "tags": [{"w": 1, "t": "Vehicle Theft .Immobilisation .Crime Prevention.Crimereduction . Displacement .Motorcycle Theft .Opportunistic Offenders .Professional Offenders . Evaluation.Mixed-Methods Design"}], "pubs": [{"i": "53e9b4a1b7602d9703fad4e7", "r": 0}], "n_citation": 0, "orgs": ["Bingen am Rhein, Germany"]}

Я пробовал читать его, используя следующий код:

import json

with open('path/xyz.json') as f:
data = json.load(f)

Однако он возвращает ошибку:

'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Как исправить эту ошибку? Спасибо.

Ответы [ 4 ]

0 голосов
/ 21 июня 2020

Если вы застряли с несколькими json «документами» в одном файле, вы всегда можете сделать это:


json_documents = []
with open('path/to/file', 'r') as fh:
  for line in fh:
    json_documents.append( json.loads(line) )

это будет декодировать строковую версию каждой строки. Примечание: это работает, только если каждая строка представляет собой целый документ json. Если несколько документов находятся в одной строке или один документ состоит из нескольких строк, вам нужно сделать что-то более интересное.

0 голосов
/ 21 июня 2020

Указанный вами JSON не является допустимым JSON.

Вы помещаете несколько объектов JSON без какого-либо разделителя или ARRAY.

Что касается проблемы с кодировкой, кажется, как объект JSON преобразуется в str из двоичного файла.

Попробуйте следующее:

with open('./xyz.json','rb') as f:
  data = json.load(f)

Передан добавленный параметр 'rb', это будет обрабатывать значения как двоичные и не будет пытаться преобразовать их в байты.

Проверьте этот ответ: https://repl.it/@SourabhLalwani / FickleBriefOperatingenvironment # xyz. json

0 голосов
/ 21 июня 2020

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

Вы можете сделать что-то вроде этого :

{
"1": {
    "id": "53f43a7bdabfaeb22f497fb8",
    "name": "Nayara Fernanda Monte",
    "h_index": 0,
    "n_pubs": 1,
    "tags": [],
    "pubs": [{
        "i": "53e9bc79b7602d97048f8888",
        "r": 2
    }, {
        "i": "56d8971cdabfae2eee185494",
        "r": 2
    }],
    "n_citation": 0,
    "orgs": [""]
},
"2": {
    "id": "53f43f5adabfaedf435b9bdf",
    "name": "J\u00f6rg B\u00e4ssmann",
    "h_index": 0,
    "n_pubs": 1,
    "tags": [{
        "w": 1,
        "t": "Vehicle Theft .Immobilisation .Crime Prevention.Crimereduction . Displacement .Motorcycle Theft .Opportunistic Offenders .Professional Offenders . Evaluation.Mixed-Methods Design"
    }],
    "pubs": [{
        "i": "53e9b4a1b7602d9703fad4e7",
        "r": 0
    }],
    "n_citation": 0,
    "orgs": ["Bingen am Rhein, Germany"]
}}
0 голосов
/ 21 июня 2020

Файлы в кодировке Microsoft UTF-16 начинаются с метки порядка байтов (BOM) FF, FE или FE, FF, в зависимости от того, является ли машина прямым или обратным порядком байтов. В этом случае Microsoft хранит символы Юникода в двухбайтовом формате. обычно каждые 2 байта хранят один символ Юникода, но даже с UTF-16 некоторые кодировки расширяются до 4 байтов.

Как уже упоминалось, encoding=UTF-16 должен его прочитать. См. Unicode HowTo .

Примечание: файлы UTF-16 в кодировке JSON могут не распознаваться всеми программами. Если вы планируете передавать их, например, в HTTP-пакете, перекодирование в UTF-8, вероятно, будет хорошим выбором.

import json

with open('path/xyz.json', encoding="UTF-16") as f:
    for line in f:
        data = json.loads(line)
...