Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?
Posted
技术标签:
【中文标题】Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?【英文标题】:Python CSV to JSON: Why is JSON significantly larger than the CSV file and how can it be fixed?Python CSV to JSON:为什么 JSON 比 CSV 文件大得多,如何修复? 【发布时间】:2017-07-21 17:03:17 【问题描述】:在将 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 中您需要为每个对象重复字段名称。我认为这就是您使用额外空间的地方 我尝试了摆脱缩进并保留分隔符的建议,它基本上缩小了 JSON 文件。这节省了一些空间。 @VivekKumar 我想你就在这里。看起来键值的冗余正在扼杀我的空间。我希望我忽略了一些东西,但我认为你在这里得到了它。 【参考方案1】:原因很简单,JSON 比 CSV 包含更多内容。
如果您查看生成的 JSON,您会发现它有很多键,例如 field1、field2 等。这是因为 JSON 没有模式的概念。每个条目都可以不同。这些额外的字符占用空间(每个字母 1 个字节)。这些加起来可能比您的实际数据更多。
除此 JSON 外,还有 [,],,,: 和 , 等字符 这些是必不可少的,因为 JSON 也非常易于人类阅读。
最后,如果您想在更小的空间内转储数据,但仍想使用 JSON,请尝试缩短键。就像使用 f1 而不是 field1。
您还可以将 JSON 转换为列表列表而不是字典。 因为您可以从 SQL 中获得该方案。
【讨论】:
感谢您在此处提供有关字段名称的提示。这是节省文件大小的好方法。由于从 SQLite 字段中提取,我的一些键位于较长的一侧。我可以减少一些键名,并在需要时提供一个新的数据字典。最后,由于文件传输速率/成本,我决定添加 gzip 压缩来移动数据,这大大节省了空间,从 3Gb 降低到 100Mb。我现在想删除一些不必要的数据,但最终用户正在请求所有这些数据。另一天的另一个修复。再次感谢! 您可能可以创建一个索引(将真实姓名映射到非常小的姓名的字典)并使用小名字。这样您也可以保留实际的字段名称以上是关于Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?的主要内容,如果未能解决你的问题,请参考以下文章