pandas.read_json()无法正常工作

时间:2019-01-21 17:10:05

标签: python json python-3.x pandas csv

我写了一个python脚本,该脚本应该通过读取json文件来形成csv。 json文件实际上是一行json,。每一行代表一个json对象。在我的json文件中,每一行都有一个键和一个值。我需要读取值并从中形成csv。样本json文件为:

{"30b26e96052f7e4cda0fe2eff99d128ab2689cfee8637c0f50e540fae811c1b9": "{\"0\": \"440899\", \"1\": \"440900\", \"-1\": \"440898\"}"}
{"669b10aa7c547109650e12f9904152e74c52d55c0a6d6c66fe1ea7b0b37a4ba7": "{\"0\": \"440900\", \"1\": \"440901\", \"-1\": \"440899\"}"}
{"1e13e07b8484e730997fbe516f1e0adf94729dbb30c2e92dfbdb9839c6e4e434": "{\"0\": \"440901\", \"1\": \"440902\", \"-1\": \"440900\"}"}

现在,我的代码是:

import pandas as pd
import json


chunks = pd.read_json(
    "test.json",
    chunksize=100,
    lines=True,
)

for df in chunks:
    df = df.to_dict(orient='records')
    for row in df:
        print(row)

我正在寻找的输出是

{\"0\": \"440899\", \"1\": \"440900\", \"-1\": \"440898\"}

这意味着我想读取值,值本身是json格式,其中有键,值对。我的目的是在csv文件中编写这样的json:

0,1,-1
440899, 440900, 440898
..., ..., ...

我现在所得到的完全令人困惑:

{'1e13e07b8484e730997fbe516f1e0adf94729dbb30c2e92dfbdb9839c6e4e434': nan, '30b26e96052f7e4cda0fe2eff99d128ab2689cfee8637c0f50e540fae811c1b9': '{"0": "440899", "1": "440900", "-1": "440898"}', '3533a5d915469b16e04c10587c1a56ff5b0a6e16e2de3ae9873ad0e5b772c10c': nan, '573a0044e9315d4d598019f8bde1ceb93eed42f6c078f2cf9769e9c7a53fd9b6': nan, '669b10aa7c547109650e12f9904152e74c52d55c0a6d6c66fe1ea7b0b37a4ba7': nan, 'a5d172be131b5ff72d621a845f5d501d5d78352a3d52b8a86af88912824d4bd9': nan, 'e41d5c4ca5ae85908cac2d8a665d1292ba6a6f98dd720651300ea9f893fb53ae': nan, 'f825fbd436b2533dc3473cda15c304c9c79a108d2e59d18ec54fc9706966536b': nan}
{'1e13e07b8484e730997fbe516f1e0adf94729dbb30c2e92dfbdb9839c6e4e434': nan, '30b26e96052f7e4cda0fe2eff99d128ab2689cfee8637c0f50e540fae811c1b9': nan, '3533a5d915469b16e04c10587c1a56ff5b0a6e16e2de3ae9873ad0e5b772c10c': nan, '573a0044e9315d4d598019f8bde1ceb93eed42f6c078f2cf9769e9c7a53fd9b6': nan, '669b10aa7c547109650e12f9904152e74c52d55c0a6d6c66fe1ea7b0b37a4ba7': '{"0": "440900", "1": "440901", "-1": "440899"}', 'a5d172be131b5ff72d621a845f5d501d5d78352a3d52b8a86af88912824d4bd9': nan, 'e41d5c4ca5ae85908cac2d8a665d1292ba6a6f98dd720651300ea9f893fb53ae': nan, 'f825fbd436b2533dc3473cda15c304c9c79a108d2e59d18ec54fc9706966536b': nan}

2 个答案:

答案 0 :(得分:2)

它认为您的键是列名。您的json看起来有点奇怪,像

那样重组它可能会更容易
{"id": "30b26e96052f7e4cda0fe2eff99d128ab2689cfee8637c0f50e540fae811c1b9", "0": "440899", "1": "440900", "-1": "440898"}

或者也许

{"id": "30b26e96052f7e4cda0fe2eff99d128ab2689cfee8637c0f50e540fae811c1b9", "data": "{\"0\": \"440899\", \"1\": \"440900\", \"-1\": \"440898\"}"}

答案 1 :(得分:1)

请注意,您的json文件的每一行都包含一个带有一个键和一个值的JSON对象,并且该值是包含对象的JSON表示形式的 string 。 这是一个函数,该函数采用您所用格式的文件的路径,并返回所需格式的数据框:

import pandas as pd
import json

def load_file(file_path):
    lines = []

    with open(file_path, "r") as file:
        for line in file:
            obj = json.loads(line)
            for k, v in obj.items():
                record = json.loads(v)
            lines.append(record)
    return pd.DataFrame(lines)

在包含您的示例输入的文件上运行此操作,我得到了DataFrame

>>print(load_file("test.json"))
        -1       0       1
0   440898  440899  440900
1   440899  440900  440901
2   440900  440901  440902

在此数据帧上调用to_csv将为您提供您指定的csv文件。