除非保存并从磁盘读取,否则无法读取jsonl字符串



免责声明:我想不出更好的标题了,我绝对愿意接受建议。

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()

最新更新