将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可能会添加一些格式,这种格式在增加大小后很多,之后又回到字典中了不多随着结束文件大小而改变。
如果您需要任何其他信息,请与我们联系。我们一定会提供。
你有什么想法?
答案 0 :(得分:1)
这是因为JSON比CSV还要多得多。
如果你看一下生成的JSON,你会发现它有很多键,比如field1,field2等。这是因为JSON没有架构的概念。每个条目都可以不同。这些额外的字符占用空间(每个字母1个字节)。这些可能会增加您实际数据的数据。
除此之外,JSON还包含[,],{,},和之类的字符, 这些是必不可少的,因为JSON也非常易读。
最后,如果你想在较小的空间中转储数据,你可以使用空间,但仍想使用JSON,尝试缩短密钥。比如使用f1而不是field1。
您还可以将JSON转换为列表而不是字典。 因为您可以从SQL获得该方案。