【问题标题】:Converting a very large JSON file to CSV将非常大的 JSON 文件转换为 CSV
【发布时间】:2018-03-10 02:28:13
【问题描述】:

我有一个大小约为 8GB 的​​ JSON 文件。当我尝试使用此脚本转换文件时:

import csv
import json

infile = open("filename.json","r")
outfile = open("data.csv","w")

writer = csv.writer(outfile)

for row in json.loads(infile.read()):
    writer.write(row)

我收到此错误:

Traceback (most recent call last):
  File "E:/Thesis/DataDownload/PTDataDownload/demo.py", line 9, in <module>
    for row in json.loads(infile.read()):
MemoryError

我确定这与文件的大小有关。有没有办法确保文件转换为 CSV 而不会出错?

这是我的 JSON 代码示例:

     {"id":"tag:search.twitter.com,2005:905943958144118786","objectType":"activity","actor":{"objectType":"person","id":"id:twitter.com:899030045234167808","link":"http://www.twitter.com/NAJajsjs3","displayName":"NAJajsjs","postedTime":"2017-08-19T22:07:20.000Z","image":"https://pbs.twimg.com/profile_images/905943685493391360/2ZavxLrD_normal.jpg","summary":null,"links":[{"href":null,"rel":"me"}],"friendsCount":23,"followersCount":1,"listedCount":0,"statusesCount":283,"twitterTimeZone":null,"verified":false,"utcOffset":null,"preferredUsername":"NAJajsjs3","languages":["tr"],"favoritesCount":106},"verb":"post","postedTime":"2017-09-08T00:00:45.000Z","generator":{"displayName":"Twitter for iPhone","link":"http://twitter.com/download/iphone"},"provider":{"objectType":"service","displayName":"Twitter","link":"http://www.twitter.com"},"link":"http://twitter.com/NAJajsjs3/statuses/905943958144118786","body":"@thugIyfe Beyonce do better","object":{"objectType":"note","id":"object:search.twitter.com,2005:905943958144118786","summary":"@thugIyfe Beyonce do better","link":"http://twitter.com/NAJajsjs3/statuses/905943958144118786","postedTime":"2017-09-08T00:00:45.000Z"},"inReplyTo":{"link":"http://twitter.com/thugIyfe/statuses/905942854710775808"},"favoritesCount":0,"twitter_entities":{"hashtags":[],"user_mentions":[{"screen_name":"thugIyfe","name":"dari.","id":40542633,"id_str":"40542633","indices":[0,9]}],"symbols":[],"urls":[]},"twitter_filter_level":"low","twitter_lang":"en","display_text_range":[10,27],"retweetCount":0,"gnip":{"matching_rules":[{"tag":null,"id":6134817834619900217,"id_str":"6134817834619900217"}]}}

(抱歉格式不好)

另一种方法可能是我有大约 8000 个较小的 json 文件,我将它们组合起来制作这个文件。它们都在自己的文件夹中,文件夹中只有一个 json。单独转换每一个然后将它们组合成一个 csv 会更容易吗?

我问这个的原因是因为我有非常基本的 Python 知识,而且我发现的所有类似问题的答案都比我能理解的要复杂得多。请帮助这个新的 python 用户将这个 json 作为 csv 读取!

【问题讨论】:

  • json 有多复杂?你能发布一个样本吗?如果它足够一致,您可以自己阅读它,而无需使用 json 模块。
  • 如果 json 文件不是太复杂,您可以逐行读取(或者可能以更大的块)并在每个片段上调用 ​​loads()。如果是,并且您edit您的问题并添加一个小样本,我们可以向您展示如何。
  • 你需要使用ijson读取这么大的文件pypi.python.org/pypi/ijson或者pandas.read_json,并以块的形式读取文件pandas.pydata.org/pandas-docs/stable/generated/…
  • 处理 8000 个较小的 json 文件将是解决大文件问题的最简单方法。
  • @cricket_007:我也有同样的想法,但事实证明json.load 实际上是单行,只是将整个文件读入一个传递给json.loads 的字符串。文件对象根本没有优化。

标签: python json csv


【解决方案1】:

单独转换每一个然后将它们组合成一个 csv 会更容易吗?

是的,肯定会的

例如,这会将每个 JSON 对象/数组(从文件中加载的任何内容)放入单个 CSV 的自己的行中。

import json, csv
from glob import glob

with open('out.csv', 'w') as f:
    for fname in glob("*.json"):  # Reads all json from the current directory
        with open(fname) as j:
            f.write(str(json.load(j)))
            f.write('\n')

使用 glob 模式**/*.json 查找嵌套文件夹中的所有 json 文件

不太清楚for row in ... 为您的数据做了什么,因为您没有数组。除非您希望每个 JSON 键都是 CSV 列?

【讨论】:

    【解决方案2】:

    是的,这绝对可以以非常简单的方式完成。我在几秒钟内打开了一个 4GB 的 json 文件。对我来说,我不需要转换为 csv。但它可以通过一种非常简单的方式完成。

    1. 使用 Docker 启动 mongodb。
    2. 在 mongodb 上创建一个临时数据库,例如测试
    3. 将 json 文件复制到 Docker 容器中
    4. 运行 mongoimport 命令

      docker exec -it container_id mongoimport --db test --collection data --file /tmp/data.json --jsonArray

    5. 运行 mongo export 命令导出到 csv

      docker exec -it container_id mongoexport --db test --collection data --csv --out data.csv --fields id,objectType

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 2018-07-14
      • 2013-09-16
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多