【问题标题】:Convert huge JSON file to csv file将巨大的 JSON 文件转换为 csv 文件
【发布时间】:2015-08-19 21:41:46
【问题描述】:

我有一个巨大的 json 文件想要传输到 csv。我在互联网上搜索了很多,我尝试自己编写 Python,但没有任何效果。我在这里被困了一个星期。有人可以帮我吗? json文件格式为:

{"Gid": "5999043768223797248", 
"rights": [{"grantorContext": "Freemium right added by Netlife", "sku": "CMO-STO-2-FREE", "rightId": "5340e29a6dc01000", "grantorId": "NETLIFE_B2C"}], 
"used_quota": "16.95", 
"creationtime": "2001-04-29 12:58:33", 
"devices": [{"last_connection": "2001-05-30 22:06:08", "os_version": "4.2.2", "auto_upload": "wifi", "last_upload": "2002-04-29 13:12:26", "device_name": "i-mobile i-STYLE 7.5", "platform": "unknow", "client_version": "2.0.0"}], 
"total_quota": 2.0, 
"Uid": ["666927729520"]}


{"Gid": "5999043740151320576", 
"rights": [{"grantorContext": "Freemium right added by Netlife", "sku": "CMO-STO-2-FREE", "rightId": "5340e29f72c05000", "grantorId": "NETLIFE_B2C"}, 
           {"grantorContext": null, "sku": "CMO-STO-25-M", "rightId": "53b5d2d8b0400000", "grantorId": "DTN"}], 
"used_quota": "480.85", 
"creationtime": "2001-04-29 12:58:38", 
"devices": [{"last_connection": "2001-08-02 03:46:05", "os_version": "8.4", "auto_upload": "wifi", "last_upload": "2015-08-02 03:46:05", "device_name": "Nokia", "platform": "unknow", "client_version": "1.0.0"}], 
"total_quota": 27.0, 
"Uid": ["465949097714"]}


{"Gid": "5999043675907166208", 
"rights": [{"grantorContext": null, "sku": "CMO-STO-25-M", "rightId": "53b5d2e161000000", "grantorId": "DTN"}, 
           {"grantorContext": "Freemium right added by Netlife", "sku": "CMO-STO-2-FREE", "rightId": "5340e29b42805000", "grantorId": "NETLIFE_B2C"}], 
"used_quota": "8.26", 
"creationtime": "2001-04-29 12:58:35", 
"devices": [{"last_connection": "2001-04-29 13:08:24", "os_version": "4.2.2", "auto_upload": "wifi", "last_upload": "2002-04-29 13:03:25", "device_name": "Nokia V797", "platform": "unknow", "client_version": "2.0.0"}], 
"total_quota": 27.0, 
"Uid": ["666994575443"]}

【问题讨论】:

  • 如果尽管你尝试了一切都没有任何效果,那么我们都注定要失败,世界即将结束。但是我对此表示怀疑,所以请发布您的一些尝试并解释会发生什么以及应该发生什么。
  • 如果您从一个小的 JSON 文件开始并编写一个程序将其转换为 CSV,那么这将是解决您的巨大问题的一步吗?
  • JSON 文件有多大?
  • 搜索'python convert json csv'(不带''引号)或'python read huge json'都会产生很多答案,包括stackoverflow上的几个。
  • 谢谢你们的所有回答,伙计们。该文件到今天为止是 350M,并且增长很快。我还在挣扎,任何帮助都会很好。

标签: python json csv


【解决方案1】:

我自己也有类似的文件!

这不是一个有效的 JSON 文件。它是一组连接成一个的 JSON 文件。来自 python json.dumps 文档

与 pickle 和 marshal 不同,JSON 不是框架协议,因此尝试 使用重复调用 dump() 来序列化多个对象 相同的 fp 将导致无效的 JSON 文件

这意味着即使它可以一次全部放入内存,您也不能使用 json.load 来读取此文件,除非您在第一行之前编辑“[”并在末尾编辑“]”并且每个元素之间的逗号(即在“}”和“{”之间的空白行

您可以使用 python json 模块并让它做我认为您想要的,将每组七个元素按顺序读取为带有键“Gid”“rights”等的python dict。

您必须使用 JSONDecoder 类的 raw_decode 方法,该方法将在结束的“}”处停止并将索引返回到它正在扫描的字符串中,以便您可以切断刚刚处理的内容。

因此,读取大文件的一大块,并在异常处理程序中尝试对元素进行 raw_decode。如果成功,保存解码结果,删除成功解码的部分,重复。如果您遇到异常,请从文件中读取另一个块并附加到您正在解码并重复的字符串。如果您仍然遇到异常,则说明您所在的 JSON 元素已损坏(或长于您的块大小,或者您未能正确处理文件结尾)。

如果您的文件小于几十(几百?)兆字节,则编码要容易得多。然后,只需将整个内容读入一个字符串,然后开始将 JSON 元素从其前面剔除,直到只剩下空格或遇到解码器错误。

【讨论】:

    【解决方案2】:

    这是蛮力的方法,当文件足够小,可以作为单个字符串处理而不会耗尽内存时

    import json
    import re
    
    multijsons = open('file.json','r').read()
    
    sep = re.compile( r'\}\s*\{' )
    jsonlist = '[' + re.sub( sep, '}, {', multijsons ) + ']'
    
    load =  json.loads( jsonlist)
    
    # quick debug:
    for item in load:
        print item
        print '\n---\n'
    

    这是我使用的,因为我的文件不是很大。考虑过对上面的代码进行编码,但不需要它,而且看起来会很棘手

    【讨论】:

    • 谢谢 nigel222。不幸的是,我的文件到今天是 350M,下周很容易达到 500M。
    • 一种不那么暴力的方法是使用 re.split。我刚刚测试了将 500Mb 字符串拆分为 500,000 个字符串,在 8Gb 的 cire-i3 PC 上花了大约两秒钟。
    【解决方案3】:

    这是使用re.split() 的一种稍微不那么暴力的方法 我已经在具有 8Gb RAM 的 core-i3 上测试了以下内容只需几秒钟

    huge="{" + "a"*1000 + "}\n"
    huge = huge * 500000
    len(huge)/1000000.0
    # get 501.5 (Mbytes)
    jsons =  re.split(r'\}\s*\{', huge)
    len(s)
    # get 500000, took about 2 seconds
    del huge  # might be a good idea to free half a gigabyte asap.
    

    split 产生单独的 JSON 元素,每个元素都在自己的字符串中,减去左大括号(第一个除外)和右大括号(最后一个除外)。所以剩下的工作(未经测试)将是

    jsons[0] = jsons[0] + '}'
    n = len(jsons)
    jsons[n-1] = '{' + jsons[n-1]
    for i in range( 1, n-1 ): jsons[i] = '{' + jsons[i] + '}'
    
    # i'd anticipate another couple of seconds to get here
    
    for j in jsons:
        data = json.load( j)
        # do whatever with data
        # will take as long as it's going to take ....
    

    【讨论】:

      猜你喜欢
      • 2021-01-31
      • 1970-01-01
      • 2020-11-06
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多