对于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')
Run Code Online (Sandbox Code Playgroud)
但这会导致错误:
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'
Run Code Online (Sandbox Code Playgroud)
关于发生了什么的任何想法?
我知道我应该使用打开二进制文件,"rb"而不是"r"因为Windows对二进制文件和非二进制文件的行为不同.
但是我不明白如果我以错误的方式打开文件会发生什么,以及为什么这种区别甚至是必要的.其他操作系统似乎通过同时处理两种文件来做得很好.
这是有关如何json.dumps用于写入gzip文件的绝佳答案。我想做的是使用dump方法代替直接将json序列化为GzipFile对象。
示例代码:
import gzip, json
data = # a dictionary of data here
with gzip.open(write_file, 'w') as zipfile:
json.dump(data, zipfile)
Run Code Online (Sandbox Code Playgroud)
引发的错误是
TypeError: memoryview: a bytes-like objet is required, not 'str'
Run Code Online (Sandbox Code Playgroud)
我相信是由于gzip write()方法想要将字节对象传递给它而引起的。根据文档,
json模块总是产生str对象,而不是byte对象。因此,fp.write()必须支持str输入。
有没有一种方法来包装json串输出为字节,这样GzipFile的write()将处理它?还是使用该方法json.dumps并将encode()结果字符串转换为bytes对象的唯一方法,如其他链接的答案一样?