Я пытаюсь преобразовать очень большой файл .json в файл .csv. Вот пример файла json, который я использовал. Файл я получу непосредственно от издателя журнала в том же формате.
Основная цель этого — извлечь все компоненты из файла .json и поместить информацию в нашу базу данных.
Ниже приведен код, который я пробовал.
import csv, json, sys
if sys.argv[1] is not None and sys.argv[2] is not None:
fileInput = sys.argv[1]
fileOutput = sys.argv[2]
inputFile = open(fileInput, encoding = "utf8") #open json file
outputFile = open(fileOutput, 'w') #load csv file
data = json.load(inputFile) #load json content
inputFile.close() #close the input file
output = csv.writer(outputFile) #create a csv.write
output.writerow(data[0].keys()) # header row
for row in data:
output.writerow(row.values()) #values row
Я получаю эту ошибку:
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 542)
@MosheRabaev На самом деле издатель отправляет файл .jsonl, и этот файл преобразуется в .json. преобразованный файл - это то, что я использую для преобразования .csv
@MosheRabaev, это недопустимый json. и мой ответ ниже подробно рассказывает о том, почему это недействительно json.

Это очень похоже на вопрос, заданный здесь Джанго конвертирует JSON в CSV
Можете ли вы поделиться образцом ответа json, который вы получаете? Возможно, есть проблема с попыткой декодировать несколько словарей и т. д.
Вот файл, который я использую для этого процесса.
Я согласен с hanshenrik, что это недопустимый json. Вы можете попробовать вызвать файл с помощью json.loads(), чтобы проверить это в своем коде.
Я загрузил файл в Python с помощью json.load, и, похоже, он жалуется на специальный символ, содержащийся в файле. Вот сообщение, которое я получил. «UnicodeDecodeError: кодек 'charmap' не может декодировать байт 0x9d в позиции 108147: сопоставление символов с <undefined>"
это недопустимый json. открывающая скобка по смещению байта 0 закрывается закрывающей скобкой по смещению байта 383, затем создается еще одна скобка по смещению байта 386, новая задняя скобка за пределами закрывающей скобки по смещению 383, которая создается по смещению байта 386, недопустима в json , единственное, что было бы допустимо после закрывающей скобки, это пробелы (пробелы, табуляции, новые строки)
это очень похоже на 100 отдельных json, которые все разделены строками, но нет простого способа проанализировать это, поскольку допустимые jsons также могут содержать символы новой строки. если поставщик данных может гарантировать, что их отдельные jsons НИКОГДА не содержат новые строки или что все их новые строки закодированы каким-либо другим способом, кроме использования шестнадцатеричных байтов 0A, например, закодированных с помощью шестнадцатеричного 5C6E вместо шестнадцатеричного 0A, тогда вы могли бы разделить jsons по новым строкам.. но этот подход ненадежен, если jsons поставщика данных могут содержать новые строки. (и спецификация json допускает новые строки, байты 0x0A, в jsons, поэтому для этого потребуется, чтобы ваш поставщик данных использовал только подмножество json без новой строки.. если ваш провайдер ищет быстрое решение этой проблемы: используйте NULL- байты, шестнадцатеричный 00, в качестве разделителя вместо шестнадцатеричного 0x0A, потому что json никогда не содержит нулевых байтов, они всегда должны быть закодированы в json, до «\ u0000», тогда вы можете надежно разделить jsons на нулевые байты)
вот что происходит, когда я пытаюсь проанализировать все 100 строк как отдельные jsons, разделив их на байт 0x0A, используя код:
<?php
$jsons=file_get_contents("https://pastebin.com/raw/p9NbH2tG");
json_decode($jsons);
echo json_last_error_msg(),PHP_EOL;
$jsons=explode("\n",$jsons);
foreach($jsons as $json){
json_decode($json);
echo json_last_error_msg(),PHP_EOL;
}
выход:
$ php foo.php
Syntax error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
No error
как видите, каждая отдельная строка в вашем файле содержит допустимый json, но в целом это недопустимый json. но разбиение их на новые строки НЕ является надежным способом, это просто работает здесь, потому что ни в одном из 100 jsons в вашем тестовом файле нет новых строк.
Можете ли вы быть уверены, что ваш json действителен?