【问题标题】:Read multiple jsons from one file [duplicate]从一个文件中读取多个 json [重复]
【发布时间】:2019-12-24 14:07:23
【问题描述】:

我正在使用python,并且我有一个文件 (data.json),其中包含多个 json,但整个文件都不是 json。

所以文件看起来像这样:

{ "_id" : 01, ..., "path" : "2017-12-12" }
{ "_id" : 02, ..., "path" : "2017-1-12" }
{ "_id" : 03, ..., "path" : "2017-5-12" }

... 的地方还有大约 30 个键,其中一些具有嵌套的 jsons(所以我的意思是上面的每个 json 都很长)。

因此,上面这个文件中的每个块都是 json,但整个文件不是 json,因为它们没有用逗号等分隔。

如何使用pandas 或简单的python 分别读取这些json?

我试过这个:

import pandas as pd
df = pd.read_json('~/Desktop/data.json', lines=True)

它实际上创建了一个数据框,其中每一行大约是一个 json,但它还为 json 的每个(第一级)键创建一个列,这使得事情变得更加混乱,而不是将整个 json 直接放在一个中细胞。

为了更清楚,我希望我的输出在“熊猫”数据框(或其他合理的数据结构)中是这样的:

    jsons
0   { "_id" : 01, ..., "path" : "2017-12-12" }
1   { "_id" : 02, ..., "path" : "2017-1-12" }
2   { "_id" : 03, ..., "path" : "2017-5-12" }

【问题讨论】:

  • 您是否需要将每个 json 转换为列表,如欺骗或数据框?

标签: python json pandas


【解决方案1】:

想法是使用read_csv,数据中不存在分隔符,然后将列的每个值转换为dictionary

import pandas as pd
import ast, json
from io import StringIO

temp=u"""{ "_id" : 1,  "path" : "2017-12-12" }
{ "_id" : 2,  "path" : "2017-1-12" }
{ "_id" : 3,  "path" : "2017-5-12" }"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep="|", names=['data'])

print (df)

#jsons
df['data'] = df['data'].apply(json.loads)
#dictionaries
#df['data'] = df['data'].apply(ast.literal_eval)

print (df)
                               data
0  {'_id': 1, 'path': '2017-12-12'}
1   {'_id': 2, 'path': '2017-1-12'}
2   {'_id': 3, 'path': '2017-5-12'}

【讨论】:

  • 酷(点赞),顺便问一下df = pd.read_csv('~/Desktop/data.json', sep="|", header=None) 呢?
  • @PoeteMaudit - 很好的解决方案,不同的是新列名是0,而不是data
  • 嗯,是的,我明白了。并且你使用df['data'] = df['data'].apply(ast.literal_eval) 将每个单元格的内容从pandas series 转换为dict?
  • @PoeteMaudit - 它按内容转换,但因为这里是字符串中的字典,所以它转换为字典。如果使用.apply(json.loads),它将转换为 jsons
  • Hm 例如,这可以正常工作,没有任何错误:stackoverflow.com/questions/12451431/…。不过,您可以留下您的答案,因为它在某些情况下可能很有用等。
【解决方案2】:

由于文件本身不是json,所以我会逐行阅读 由于该行是字符串格式,所以我将使用yaml 将其转换为dict 类型 然后最后我将append全部放在dataframe

import yaml
import pandas as pd
f = open('data.json')
line = f.readline()
df = pd.DataFrame()

while line:

    #string line to dict
    d = yaml.load(line)

    #temp dataframe
    df1=pd.DataFrame(d,index=[0])

    #append in every iteration
    df=df.append(df1, ignore_index=True)
    line = f.readline()

f.close()
print(df)
#output
  _id        path
0  01  2017-12-12
1  02   2017-1-12
2  03   2017-5-12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 2020-12-02
    • 2016-08-18
    • 2019-02-21
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多