首页 > 解决方案 > 如何使用 Python 将大型 json 文件提取到 csv

问题描述

我正在尝试将一个非常大的 .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)

标签: jsonpython-3.xcsv

解决方案


那不是有效的json。字节偏移量 0 上的左括号用字节偏移量 383 上的右括号关闭,然后在字节偏移量 386 上创建另一个括号,在偏移量 383 上的右括号之外的新备份在字节偏移量 386 上创建在 json 中是非法的,在右括号之后唯一合法的是空格(空格、制表符、换行符)

它看起来很像 100 个单独的 json,它们都是行分隔的,但是没有简单的方法来解析它,因为有效的 json 也可能包含换行符。如果数据提供者可以保证他们的单个 json 永远不包含换行符,或者他们所有的换行符都以其他方式编码而不是使用十六进制 0A 字节,例如使用十六进制 5C6E 而不是十六进制 0A 编码,那么您可以拆分 json通过换行符.. 但如果数据提供者的 jsons 可能包含换行符,这种方法是不可靠的。(并且 json 规范允许 jsons 中的换行符,0x0A 字节,因此这将要求您的数据提供者仅使用缺少换行符的 json 子集。如果您的提供者正在寻找此问题的快速修复:使用 NULL-字节,十六进制 00,而不是十六进制 0x0A 作为分隔符,因为 json 从不包含空字节,

这是当我尝试将所有 100 行解析为单独的 json 时发生的情况,将它们按 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 个 json 中没有任何换行符。


推荐阅读