将包含多行JSON的文件加载到Pandas中


97

我正在尝试将JSON文件读入Python熊猫(0.14.0)数据帧中。这是JSON文件的第一行:

{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "P_Mk0ygOilLJo4_WEvabAA", "review_id": "OeT5kgUOe3vcN7H6ImVmZQ", "stars": 3, "date": "2005-08-26", "text": "This is a pretty typical cafe.  The sandwiches and wraps are good but a little overpriced and the food items are the same.  The chicken caesar salad wrap is my favorite here but everything else is pretty much par for the course.", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}

我正在尝试执行以下操作:df = pd.read_json(path)

我收到以下错误(具有完整的追溯):

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/d/anaconda/lib/python2.7/site-packages/pandas/io/json.py", line 198, in read_json
    date_unit).parse()
  File "/Users/d/anaconda/lib/python2.7/site-packages/pandas/io/json.py", line 266, in parse
    self._parse_no_numpy()
  File "/Users/d/anaconda/lib/python2.7/site-packages/pandas/io/json.py", line 483, in _parse_no_numpy
    loads(json, precise_float=self.precise_float), dtype=None)
ValueError: Trailing data

有什么Trailing data错误?如何将其读入数据框?

遵循一些建议,以下是.json文件的几行:

{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "P_Mk0ygOilLJo4_WEvabAA", "review_id": "OeT5kgUOe3vcN7H6ImVmZQ", "stars": 3, "date": "2005-08-26", "text": "This is a pretty typical cafe.  The sandwiches and wraps are good but a little overpriced and the food items are the same.  The chicken caesar salad wrap is my favorite here but everything else is pretty much par for the course.", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}
{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "TNJRTBrl0yjtpAACr1Bthg", "review_id": "qq3zF2dDUh3EjMDuKBqhEA", "stars": 3, "date": "2005-11-23", "text": "I agree with other reviewers - this is a pretty typical financial district cafe.  However, they have fantastic pies.  I ordered three pies for an office event (apple, pumpkin cheesecake, and pecan) - all were delicious, particularly the cheesecake.  The sucker weighed in about 4 pounds - no joke.\n\nNo surprises on the cafe side - great pies and cakes from the catering business.", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}
{"votes": {"funny": 0, "useful": 0, "cool": 0}, "user_id": "H_mngeK3DmjlOu595zZMsA", "review_id": "i3eQTINJXe3WUmyIpvhE9w", "stars": 3, "date": "2005-11-23", "text": "Decent enough food, but very overpriced. Just a large soup is almost $5. Their specials are $6.50, and with an overpriced soda or juice, it's approaching $10. A bit much for a cafe lunch!", "type": "review", "business_id": "Jp9svt7sRT4zwdbzQ8KQmw"}

根据规范,我正在使用的此.json文件每行包含一个JSON对象。

我按照建议尝试了jsonlint.com网站,它给出了以下错误:

Parse error on line 14:
...t7sRT4zwdbzQ8KQmw"}{    "votes": {
----------------------^
Expecting 'EOF', '}', ',', ']'

1
文件中有其他数据,这些数据不是JSON对象的一部分。
马丁·彼得斯

json文件的最后几行是什么样的?
布莱恩·奥克利

2
这个例子对我来说在熊猫0.16.0中很好看。您使用的是哪个版本的熊猫?
安迪·海登

1
@ user62198更新至0.16.0,对read_json进行了一些修复。
安迪·海顿

1
@Cornel Ghiban,我可以加载整个文件或读取一行。转换为您提到的格式似乎有些困难,因为有超过500万条这样的记录。
user62198 2015年

Answers:



33

您必须逐行阅读它。例如,您可以在reddit上使用ryptophan提供的以下代码:

import pandas as pd

# read the entire file into a python array
with open('your.json', 'rb') as f:
    data = f.readlines()

# remove the trailing "\n" from each line
data = map(lambda x: x.rstrip(), data)

# each element of 'data' is an individual JSON object.
# i want to convert it into an *array* of JSON objects
# which, in and of itself, is one large JSON object
# basically... add square brackets to the beginning
# and end, and have all the individual business JSON objects
# separated by a comma
data_json_str = "[" + ','.join(data) + "]"

# now, load it into pandas
data_df = pd.read_json(data_json_str)

嗨,我正在尝试读取json文件并将其存储到dataframe中。但是,当我使用您的代码时,出现错误:“ TypeError:序列项0:预期的str实例,找到了字节”。你知道这有什么问题吗?
ngoduyvu

4

以下代码帮助我将JSON内容加载到dataframe

import json
import pandas as pd

with open('Appointment.json', encoding="utf8") as f:
    data = f.readlines()
    data = [json.loads(line) for line in data] #convert string to dict format
df = pd.read_json(data) # Load into dataframe

1

我有一个类似的问题。

事实证明,pd.read_json(myfile.json)它将自动在父文件夹中搜索,但是如果您不在与该文件相同的文件夹中,则会返回此“跟踪数据”错误。

我知道了,因为当我尝试使用时open('myfile.json', 'r'),出现了FileNotFound错误,因此我检查了路径。

我未能将myfile.json移动到与笔记本相同的文件夹中。

将其更改为pd.read_json('../myfile.json')刚刚工作。


1
它给出ValueError: Trailing data应该何时给出的愚蠢FileNotFound。这也发生在我身上。
ProGirlXOXO

0

我也遇到了同样的问题。当您的数据写在以'\ n'之类的末尾分隔的行中时,就会发生这种情况;您需要先逐行阅读它们,然后将每一行转换为python内置类型。我是这样解决的:

with open("/path/to/file") as f:
    content = f.readlines()

data = [eval(c) for c in content]
data = pd.DataFrame(data)

祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.