0

我有一组.jsonl.gz文件。我可以使用脚本阅读它们:

 import json
 import gzip
 with gzip.open(filepath, "r") as read_file:  # file path ends with .jsonl.gz
     try:
         # read gzip file which contains a list of json files (json lines)
         # each json file is a dictionary of nested dictionaries
         json_list = list(read_file)
     except:
         print("fail to read thezip ")

然后我进行一些处理并获取一些 .json 文件并将它们存储在一个列表中。

for num, json_file in enumerate(json_list):        
        try:
            j_file = json.loads(json_file)
            (...some code...)
        except:
           print("fail")

我的问题是将它们再次写入的正确方法是什么.jsonl.gz

这是我的尝试

jsonfilename = 'valid_' +str(num)+'.jsonl.gz'
with gzip.open(jsonfilename, 'wb') as f:
     for dict in list_of_nested_dictionaries:
         content.append(json.dumps(dict).encode('utf-8'))
     f.write(content)

但我得到了这个错误: TypeError: memoryview: a bytes-like object is required, not 'list'

然后我尝试按原样压缩字典列表:

jsonfilename = 'valid_' +str(num)+'.jsonl.gz'
with gzip.open(jsonfilename, 'wb') as f:
    f.write(json.dumps(list_of_nested_dictionaries).encode('utf-8'))

但是这里的问题是将整个列表压缩为一个块,当我读回它时,我得到了一个元素,它是整个存储的列表,而不是我从第一步得到的 json 文件列表。

这是我用来阅读的代码

with gzip.open('valid_3.jsonl.gz', "r" , ) as read_file:
    try:
        json_list = list(read_file) # read zip file
        print(len(json_list))# I got 1 here
    except:
        print("fail")
json_list[0].decode('utf-8')
4

2 回答 2

0

解决方案就是这样

     with gzip.open(jsonfilename, 'wb') as f:
     for dict in list_of_nested_dictionaries:
         content.append((json.dumps(dict)+'\n').encode('utf-8'))
     f.writelines(content)
于 2020-05-01T23:47:03.650 回答
0

f.write(content)接受一个字节串,但你传递给它一个字节串列表。

f.writelines(content)将遍历并写入列表中的每个字节字符串。

编辑:顺便说一句,gzip 用于压缩单个文件。如果您需要将多个文件压缩为一个,我建议先将它们打包在一个tarball中,然后再 gzip 压缩。

于 2020-05-01T21:38:24.170 回答