Python CSV到JSON:为什么JSON比CSV文件大很多?如何修复它?
我在将CSV文件转换为JSON时遇到了一个有趣的问题。我根据SQLite查询的输出生成一个CSV文件,并将其写入硬盘 然后,我使用熊猫将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
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)