gzip 嵌套字典列表
gzip a list of nested dictionaries
我有一组 .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'
然后我尝试按原样 gzip 字典列表:
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')
f.write(content)
接受一个字节串,但你传递给它的是一个字节串列表。
f.writelines(content)
将遍历并写入列表中的每个字节串。
编辑:顺便说一句,gzip 用于压缩单个文件。如果你需要将多个文件压缩成一个文件,我建议先将它们打包成一个 tarball 然后再 gzip 那个。
解决方法就是这样
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)
我有一组 .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'
然后我尝试按原样 gzip 字典列表:
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')
f.write(content)
接受一个字节串,但你传递给它的是一个字节串列表。
f.writelines(content)
将遍历并写入列表中的每个字节串。
编辑:顺便说一句,gzip 用于压缩单个文件。如果你需要将多个文件压缩成一个文件,我建议先将它们打包成一个 tarball 然后再 gzip 那个。
解决方法就是这样
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)