将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,您将看到它具有很多像field1,field2等的键。这是因为JSON没有模式的概念。每个条目可以不同。这些多余的字符占用空间(每个字母1个字节)。这些可能加起来比实际数据还多。

除此之外,JSON还具有[,],{,} 、:和这样的字符,
这些是必不可少的,因为JSON也是人类可读的。

最后,如果您想在较小的空间中转储数据,但仍可以使用JSON,请尝试缩短密钥。就像使用f1代替field1一样。

您还可以将JSON转换为列表列表,而不是字典。
因为您有SQL可用的方案。

07-24 09:45
查看更多