Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CSV到JSON:为什么JSON比CSV文件大很多?如何修复它?_Python_Json_Csv_Pandas_Dictionary - Fatal编程技术网

Python CSV到JSON:为什么JSON比CSV文件大很多?如何修复它?

Python CSV到JSON:为什么JSON比CSV文件大很多?如何修复它?,python,json,csv,pandas,dictionary,Python,Json,Csv,Pandas,Dictionary,我在将CSV文件转换为JSON时遇到了一个有趣的问题。我根据SQLite查询的输出生成一个CSV文件,并将其写入硬盘 然后,我使用熊猫将CSV文件加载到脚本中: import pandas as pd df_var = pd.read_csv('input.csv',header=0, low_memory=False) 我使用了low_memory选项,因为数据帧由多个数据类型组成。如果有人建议,我并不反对将所有内容存储为字符串值 dataframe的每一行代表一条记录(每条记录有144

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

然后,我使用熊猫将CSV文件加载到脚本中:

import pandas as pd

df_var  = pd.read_csv('input.csv',header=0, low_memory=False)
我使用了low_memory选项,因为数据帧由多个数据类型组成。如果有人建议,我并不反对将所有内容存储为字符串值

dataframe的每一行代表一条记录(每条记录有144个字段/列),因此我一次剥离一行,并将其输入到我构建的类中,以将该行转换为字典(这在类中):

从这里我将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中有可用的方案。

打开这两个文件,看看大小的差异来自何处,怎么样?首先,关闭缩进。每行一个对象和四个空格缩进的美化JSON中可能有大量空白。同样在csv中,您将字段名定义为标题,但在JSON中,您需要为每个对象重复字段名。我想这就是你额外空间使用的地方。我尝试了去掉缩进的建议,把分隔符留在那里,基本上缩小了JSON文件。这节省了一些空间@维维克库马尔,我想你就在这里。看来键值中的冗余正在扼杀我的空间。我希望有什么我忽略了,但我想你已经明白了。谢谢你在字段名上的提示。这是一种节省文件大小的好方法。由于从SQLite字段中提取,我的一些键位于较长的一侧。我可以减少一些键名,并在需要时提供一个新的数据字典。最后,由于文件传输速率/成本,我决定添加gzip压缩来移动数据,这大大节省了空间,从3Gb减少到100Mb。我现在想删除一些不必要的数据,但所有这些数据都是最终用户请求的。改天再修一次。再次感谢!您可能可以制作索引(将实名映射到非常小的名称的词典)并使用小名称。这样,您也可以保留实际的字段名
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)