【问题标题】:How to extract large json file to csv using Python如何使用 Python 将大型 json 文件提取到 csv
【发布时间】:2019-07-02 04:04:34
【问题描述】:

我正在尝试将一个非常大的 .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是有效的吗?
  • @MosheRabaev 实际上发布者发送 .jsonl 文件并且该文件被转换为 .json。转换后的文件是我用于 .csv 转换的文件
  • @MosheRabaev 它不是有效的 json。我在下面的回答深入探讨了为什么它不是有效的 json。

标签: json python-3.x csv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这看起来很像这里提出的问题Django convert JSON to CSV

    你能分享一个你得到的 json 响应的样本吗?尝试解码多个字典等可能存在问题。

    【讨论】:

    • 这是我用于此过程的file
    • 我同意 hanshenrik 的观点,即这不是有效的 json。您可以尝试使用 json.loads() 调用该文件以在您的代码中验证这一点。
    • 我使用 json.load 将文件加载到 Python 中,它似乎在抱怨文件中包含一个特殊字符。这是我收到的信息。 “UnicodeDecodeError:‘charmap’编解码器无法解码位置 108147 中的字节 0x9d:字符映射到
    猜你喜欢
    • 2017-01-29
    • 2015-10-10
    • 2021-09-02
    • 2018-07-14
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多