Как извлечь большой файл json в csv с помощью Python

Я пытаюсь преобразовать очень большой файл .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)

Можете ли вы быть уверены, что ваш json действителен?

Moshe Rabaev 02.07.2019 06:07

@MosheRabaev На самом деле издатель отправляет файл .jsonl, и этот файл преобразуется в .json. преобразованный файл - это то, что я использую для преобразования .csv

Varsha G 02.07.2019 06:12

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

hanshenrik 02.07.2019 06:41
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
3
265
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это очень похоже на вопрос, заданный здесь Джанго конвертирует JSON в CSV

Можете ли вы поделиться образцом ответа json, который вы получаете? Возможно, есть проблема с попыткой декодировать несколько словарей и т. д.

Вот файл, который я использую для этого процесса.

Varsha G 02.07.2019 06:32

Я согласен с hanshenrik, что это недопустимый json. Вы можете попробовать вызвать файл с помощью json.loads(), чтобы проверить это в своем коде.

WZLWebNmedia 02.07.2019 07:49

Я загрузил файл в Python с помощью json.load, и, похоже, он жалуется на специальный символ, содержащийся в файле. Вот сообщение, которое я получил. «UnicodeDecodeError: кодек 'charmap' не может декодировать байт 0x9d в позиции 108147: сопоставление символов с <undefined>"

WZLWebNmedia 02.07.2019 08:06
Ответ принят как подходящий

это недопустимый 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 в вашем тестовом файле нет новых строк.

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