将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可用的方案。