Python 3.x 为什么json.dumps(json.loads(line))的长度大于line?

Python 3.x 为什么json.dumps(json.loads(line))的长度大于line?,python-3.x,Python 3.x,为什么json.dumps(json.loads(line))的长度通常大于行的长度 我有大量的json对象,我试图把不好的对象(很少有细节)分类出来。因此,我从一个.jsonl文件中读取json对象,并将好的json对象(包含大量细节)保存在一个新文件中。我整理了大约60%的json对象,但我的文件小了大约6%,我觉得很奇怪,于是运行了一个测试: 我将json对象行的长度与json.dumps(json.loads(line))进行比较。对象json.dumps(json.loads(line

为什么
json.dumps(json.loads(line))的长度通常大于行的长度

我有大量的json对象,我试图把不好的对象(很少有细节)分类出来。因此,我从一个.jsonl文件中读取json对象,并将好的json对象(包含大量细节)保存在一个新文件中。我整理了大约60%的json对象,但我的文件小了大约6%,我觉得很奇怪,于是运行了一个测试: 我将json对象行的长度与
json.dumps(json.loads(line))
进行比较。对象
json.dumps(json.loads(line))
的长度是行长度的83%到121%。
json.dumps(json.loads(line))的平均长度为行长度的109,5%

为什么会这样?我如何预防?如何使用Python创建子文件而不增加10%的文件

我发现了一个例子:

b=r'{“Ä”:“ß”}
印刷品(透镜(b))
打印(len(json.dumps(json.loads(b)))
打印(len(json.dumps(json.loads(b),分隔符=(',',':'))
输出为10、20和19。我们看到紧凑编码的区别只是一个空格。但是卸载的负载是原始负载的两倍长。当我打印出json.dumps(json.loads(b))时,我得到

{"\u00c4": "\u00df"}
似乎json.dumps()编码的字符(如Ä和ß)不太节省空间。我可以尝试用更好的编码编写自己的转储函数,但我喜欢节省时间

我刚刚找到了(答案中有Finomnis的评论)

如果我尝试

b=r'{“Ä”:“ß”}
印刷品(透镜(b))
打印(len(json.dumps(json.loads(b),确保_ascii=False)))
这两种情况下的长度都是10。耶:-D

你试过了吗

json.dumps(json.load(行),分隔符=(',',':'))
此外,如果确实想节省空间,您可能希望禁用ascii编码,但这可能与所有json库不兼容,因此请谨慎使用

json.dumps(json.load(行),分隔符=(',',':'),确保_ascii=False)


例子
导入json
a=[[1,2,3],{'a':1,'b':2,'c':'ä'}]
打印(json.dumps(a))
打印(json.dumps(a,分隔符=(',',':'))
打印(json.dumps(a,分隔符=(',',':'),确保_ascii=False))
给出:

[[1, 2, 3], {"a": 1, "b": 2, "c": "\u00e4"}]
[[1,2,3],{"a":1,"b":2,"c":"\u00e4"}]
[[1,2,3],{"a":1,"b":2,"c":"ä"}]
你试过了吗

json.dumps(json.load(行),分隔符=(',',':'))
此外,如果确实想节省空间,您可能希望禁用ascii编码,但这可能与所有json库不兼容,因此请谨慎使用

json.dumps(json.load(行),分隔符=(',',':'),确保_ascii=False)


例子
导入json
a=[[1,2,3],{'a':1,'b':2,'c':'ä'}]
打印(json.dumps(a))
打印(json.dumps(a,分隔符=(',',':'))
打印(json.dumps(a,分隔符=(',',':'),确保_ascii=False))
给出:

[[1, 2, 3], {"a": 1, "b": 2, "c": "\u00e4"}]
[[1,2,3],{"a":1,"b":2,"c":"\u00e4"}]
[[1,2,3],{"a":1,"b":2,"c":"ä"}]

请提供两个json examplesHm,在这种情况下,我必须尝试创建一个示例。。。我认为这可能是一个已知的效果。但是
print(len(json.dumps(json.loads(b),分隔符=(',',':'),确保ascii=False))
给出了长度9:PAlso,如果你真的担心空间效率,你应该在以后对其进行gzip处理,json文件非常可压缩请提供几个json示例shm,在这种情况下,我必须尝试创建一个示例。。。我认为这可能是一个已知的效果。但是
print(len(json.dumps(json.loads(b),分隔符=(',',':'),确保ascii=False))
给出了长度9:PAlso,如果你真的担心空间效率,你应该在以后对其进行gzip处理,json文件非常好。这样效果更好。平均而言,我的加载和压缩编码转储jsons对象只比原始对象大1,7%,而不是9,5%。但是你知道为什么会这样吗?我认为json是标准化的,因此json对象的表示字符串总是相同的。但我似乎不是这样。应该是。。。也许您以前的文件没有完全遵循标准,如果没有一些json示例,就无法进行进一步的调查。。。但是要找到差异并不是那么难,只需遍历输入和输出字符串,直到找到差异。我发现差异出现在像Ä和ß这样的字符上。我在问题中包括了一个例子。@Mundron:Add
确保_ascii=False
dumps
的参数中,它将允许像Ä和ß这样的Unicode字符在输出中保留为文字。默认值为
True
,这意味着它们将始终被转义。哦,太好了。这样效果更好。平均而言,我的加载和压缩编码转储jsons对象只比原始对象大1,7%,而不是9,5%。但是你知道为什么会这样吗?我认为json是标准化的,因此json对象的表示字符串总是相同的。但我似乎不是这样。应该是。。。也许您以前的文件没有完全遵循标准,如果没有一些json示例,就无法进行进一步的调查。。。但是要找到差异并不是那么难,只需遍历输入和输出字符串,直到找到差异。我发现差异出现在像Ä和ß这样的字符上。我在问题中包括了一个例子。@Mundron:Add
确保_ascii=False
dumps
的参数中,它将允许像Ä和ß这样的Unicode字符在输出中保留为文字。默认值为
True
,这意味着它们将始终被转义。