Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?

Posted

技术标签:

【中文标题】Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?【英文标题】:Python CSV to JSON: Why is JSON significantly larger than the CSV file and how can it be fixed?Python CSV to JSON:为什么 JSON 比 CSV 文件大得多,如何修复? 【发布时间】:2017-07-21 17:03:17 【问题描述】:

在将 CSV 文件转换为 JSON 时,我遇到了一个有趣的问题。我根据 SQLite 查询的输出生成一个 CSV 文件并将其写入硬盘。

然后我使用 Pandas 将 CSV 文件加载到我的脚本中:

import pandas as pd

df_var  = pd.read_csv('input.csv',header=0, low_memory=False)

我使用了 low_memory 选项,因为数据帧由多种数据类型组成。如果有人建议,我不反对将所有内容存储为字符串值。

数据框的每一行代表一条记录(每条记录有 144 个字段/列),所以我一次删除一行并将其输入我构建的类中,以将该行转换为字典(这是在类):

class CSVParser:


    def __init__(self, recordid, tjson=):

        self.recordid = recordid
        self.json     = tjson

    def create_json(self, df):

        o_dict = 
                    'root': 
                        'id': 
                            'field1':df['field1'],
                            'field2':df['field2'],
                            'field3':self.recordid,
                        ,

                        'core': 
                            'field1':df['field1'],
                            'field2':df['field2'],
                            'field3':df['field3'],
                            'field4':df['field4'],
                            'field5':df['field5'],
                            'field6':df['field6'],
                        ,

                        #REMAINING RECORDS LEFT OUT FOR BREVITY

                    
                

        self.json.append(o_dict)

从这里我将 JSON 写入磁盘

def write_json(self):
    #if self is not empty write JSON to file

    if self.json:
        filename = 'output/' + self.recordid + '_output.json'
        with open(filename,'w') as outfile:
            json.dump(self.json,outfile, indent=4, separators=(',', ': '))
        print('JSON saved to drive')
    else:
        print('\nEmpty JSON\n')
        return(self.json)

这就是我得到的结果,假设我只运行 500 条记录,CSV 文件的大小约为 23MB,生成的 JSON 约为 190MB!当然,我添加了一些我似乎无法找到的无意格式。我相信 JSON 文件会产生比 CSV 更小的文件大小。

最后一点信息,我最初使用 OrderedDict 来运行它,但是当我看到生成的 JSON 文件大小时,我想 OrderedDict 可能正在添加一些格式,从而大大增加了大小,在返回字典后并不多随最终文件大小而变化。

如果您需要任何其他信息,请告诉我,我一定会提供。

你有什么想法?

【问题讨论】:

你打开这两个文件,看看大小差异是从哪里来的? 关闭缩进,一方面。每行一个对象和四个空格缩进的美化 JSON 中可以有很多空格。 同样在 csv 中,您将字段名称定义为标题,但在 json 中您需要为每个对象重复字段名称。我认为这就是您使用额外空间的地方 我尝试了摆脱缩进并保留分隔符的建议,它基本上缩小了 JSON 文件。这节省了一些空间。 @VivekKumar 我想你就在这里。看起来键值的冗余正在扼杀我的空间。我希望我忽略了一些东西,但我认为你在这里得到了它。 【参考方案1】:

原因很简单,JSON 比 CSV 包含更多内容。

如果您查看生成的 JSON,您会发现它有很多键,例如 field1、field2 等。这是因为 JSON 没有模式的概念。每个条目都可以不同。这些额外的字符占用空间(每个字母 1 个字节)。这些加起来可能比您的实际数据更多。

除此 JSON 外,还有 [,],,,: 和 , 等字符 这些是必不可少的,因为 JSON 也非常易于人类阅读。

最后,如果您想在更小的空间内转储数据,但仍想使用 JSON,请尝试缩短键。就像使用 f1 而不是 field1。

您还可以将 JSON 转换为列表列表而不是字典。 因为您可以从 SQL 中获得该方案。

【讨论】:

感谢您在此处提供有关字段名称的提示。这是节省文件大小的好方法。由于从 SQLite 字段中提取,我的一些键位于较长的一侧。我可以减少一些键名,并在需要时提供一个新的数据字典。最后,由于文件传输速率/成本,我决定添加 gzip 压缩来移动数据,这大大节省了空间,从 3Gb 降低到 100Mb。我现在想删除一些不必要的数据,但最终用户正在请求所有这些数据。另一天的另一个修复。再次感谢! 您可能可以创建一个索引(将真实姓名映射到非常小的姓名的字典)并使用小名字。这样您也可以保留实际的字段名称

以上是关于Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 中的 csv 文件生成 JSON?

为啥 pandas to_csv 逗号分隔不起作用?

为啥我的应用程序无法从我的 API 读取 JSON?

通过 CSV 导出/导入 mysql json 对象

hive表加载csv格式数据或者json格式数据

8.03-json_to_csv