kri*_*ine 3 python csv json dictionary pandas
在将 CSV 文件转换为 JSON 时,我遇到了一个有趣的问题。我根据 SQLite 查询的输出生成一个 CSV 文件并将其写入硬盘。
然后,我使用 Pandas 将 CSV 文件加载到我的脚本中:
import pandas as pd
df_var = pd.read_csv('input.csv',header=0, low_memory=False)
Run Code Online (Sandbox Code Playgroud)
我使用了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)
Run Code Online (Sandbox Code Playgroud)
从这里我将 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)
Run Code Online (Sandbox Code Playgroud)
这就是我得到的结果,假设我只运行 500 条记录,CSV 文件大小约为 23MB,生成的 JSON 约为 190MB!当然,我无意中添加了一些我似乎找不到的格式。我相信 JSON 文件会产生比 CSV 更小的文件大小。
最后一点信息,我最初使用 OrderedDict 来运行它,但是当我看到生成的 JSON 文件大小时,我想 OrderedDict 可能添加了一些格式,从而大大增加了大小,在移回字典后,没有太大变化最终文件大小。
如果您需要任何其他信息,请告诉我,我一定会提供。
你怎么看?
原因很简单,JSON 比 CSV 拥有更多内容。
如果您查看生成的 JSON,您会发现它有很多键,例如 field1、field2 等。这是因为 JSON 没有模式的概念。每个条目都可以不同。这些额外的字符占用空间(每个字母 1 个字节)。这些加起来可能会比您的实际数据更多。
除此之外,JSON 还具有 [、]、{、}、: 和 等字符,这些字符非常重要,因为 JSON 也非常易于人类阅读。
最后,如果您想在更少的空间中转储数据,但仍想使用 JSON,请尝试缩短键。就像使用 f1 而不是 field1 一样。
您还可以将 JSON 转换为列表的列表而不是字典。因为您可以从 SQL 获得该方案。