对于Python3,我按照@Martijn Pieters的代码编写了以下代码:
import gzip
import json
# writing
with gzip.GzipFile(jsonfilename, 'w') as fout:
for i in range(N):
uid = "whatever%i" % i
dv = [1, 2, 3]
data = json.dumps({
'what': uid,
'where': dv})
fout.write(data + '\n')
但这会导致错误:
Traceback (most recent call last):
...
File "C:\Users\Think\my_json.py", line 118, in write_json
fout.write(data + '\n')
File "C:\Users\Think\Anaconda3\lib\gzip.py", line 258, in write
data = memoryview(data)
TypeError: memoryview: a bytes-like object is required, not 'str'
有什么想法是怎么回事?
3条答案
按热度按时间jljoyd4f1#
这里有四个转变步骤。
1.包含该数据结构的序列化表示的Python字符串(“JSON”)
1.包含该字符串表示形式的字节列表(“UTF-8”)
1.包含该先前字节列表(“gzip”)的较短表示的字节列表
让我们一步一步来。
请注意,添加
"\n"
在这里是完全多余的。它不会破坏任何东西,但除此之外它没有任何用处。我添加它只是因为您的代码示例中有它。阅读的工作方式正好相反:
当然,这些步骤可以合并:
和
yeotifhr2#
here(感谢@Rafe)提到的解决方案有一个很大的优势:因为编码是动态完成的,所以你不需要为生成的json创建两个完整的中间字符串对象。
此外,阅读和解码也很简单:
mnowg1ta3#
要写入
json.gz
,可以使用以下代码段:要读取
json.gz
,可以使用以下代码片段: