免责声明:我想不出更好的标题了,我绝对愿意接受建议。
1.解码和json.loads((:
我目前正在尝试从一个解码的字符串中读取一个json,代码如下:
def _load_values_from_json(jsonl: str) -> List[Dict[str, str]]:
json_values = list()
# jsonl is a byte string `b'...'`
for line in jsonl.decode():
breakpoint()
json_line = json.loads(line)
json_values.append(json_line)
这会给我一个输出,比如:
# Breakpoint
>>> line
'{'
但是,如果我将字符串保存为.json
,然后打开并重复该过程:
2.保存解码字符串并从磁盘读取:
def _load_values_from_json(jsonl: str) -> List[Dict[str, str]]:
json_values = list()
_save_jsonl_file(jsonl)
jsonl_from_file = _read_jsonl_file()
for line in jsonl_from_file:
breakpoint()
json_line = json.loads(line)
json_values.append(json_line)
def _save_jsonl_file(jsonl):
with open("/tmp/jsonl.json", "w") as fout:
fout.write(jsonl.decode())
def _read_jsonl_file():
with open("/tmp/jsonl.json", "r") as fin:
return fin.readlines()
这将产生正确读取的json:
# Breakpoint
>>> line
'{"name":"Foo"}'
# Continue
>>> line
'{"name":"Loo"}'
附加信息
在这两种情况下,我都用调用函数
# Loaded from TensorFlow Dataset eagerly
inputs = inputs.numpy()
# Inputs comes as byte string
values = _load_values_from_json(inputs)
有人能帮助我理解这种行为吗?或者我在1中做错了什么。案例
我不想每次读json 时都I/O
正如问题评论中所讨论的,问题非常简单/明显:
解决方案
有必要像.readlines()
那样用"n"
分割解码的bytes
。
def _load_values_from_json(jsonl: bytes) -> List[Dict[str, str]]:
values = list()
jsonl = _read_jsonl(jsonl)
for line in jsonl.split("n"): # Here!
json_obj = json.loads(line)
values.append(json_obj)
def _read_jsonl(jsonl: bytes) -> str:
return jsonl.decode()