Đang tải một tệp có nhiều hơn một dòng JSON vào Pandas


94

Tôi đang cố đọc trong tệp JSON vào khung dữ liệu Python pandas (0.14.0). Đây là dòng đầu tiên của tệp 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"}

Tôi đang cố gắng làm những điều sau đây: df = pd.read_json(path).

Tôi đang gặp lỗi sau (có theo dõi đầy đủ):

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

Là gì Trailing datalỗi? Làm cách nào để đọc nó vào khung dữ liệu?

Sau một số gợi ý, đây là một vài dòng của tệp .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"}

Tệp .json này tôi đang sử dụng chứa một đối tượng JSON trong mỗi dòng theo đặc điểm kỹ thuật.

Tôi đã thử trang web jsonlint.com theo đề xuất và nó xuất hiện lỗi sau:

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

1
Bạn có dữ liệu bổ sung trong tệp không phải là một phần của đối tượng JSON.
Martijn Pieters

Vài dòng cuối cùng của tệp json trông như thế nào?
Bryan Oakley

2
Ví dụ này đọc tốt cho tôi trong gấu trúc 0.16.0. Bạn đang sử dụng phiên bản gấu trúc nào?
Andy Hayden

1
@ user62198 cập nhật lên 0.16.0, đã có một số bản sửa lỗi cho read_json.
Andy Hayden

1
@Cornel Ghiban, tôi có thể tải toàn bộ tệp hoặc đọc từng dòng. Có vẻ như việc chuyển đổi sang định dạng bạn đã đề cập có thể hơi khó khăn vì có hơn 5 triệu bản ghi như vậy.
user62198

Câu trả lời:


242

Từ phiên bản 0.19.0 của Pandas, bạn có thể sử dụng linestham số như sau:

import pandas as pd

data = pd.read_json('/path/to/file.json', lines=True)

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này có liên quan đến lineslập luận? github.com/pandas-dev/pandas/issues/15132
Chuck

33

Bạn phải đọc nó từng dòng một. Ví dụ: bạn có thể sử dụng mã sau do ryptophan cung cấp trên reddit :

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)

Xin chào, tôi đang cố đọc tệp un json và lưu trữ vào khung dữ liệu. Tuy nhiên, khi tôi sử dụng mã của bạn, tôi gặp lỗi: "TypeError: chuỗi mục 0: thể hiện str dự kiến, đã tìm thấy byte". Bạn có biết những gì sai với nó?
ngoduyvu

3

Đoạn mã sau đã giúp tôi tải JSONnội dung vào 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

Tôi đã có một vấn đề tương tự.

Nó chỉ ra rằng nó pd.read_json(myfile.json)sẽ tự động tìm kiếm trong thư mục mẹ, nhưng nó trả về lỗi 'dữ liệu theo dõi' này nếu bạn không ở cùng thư mục với tệp.

Tôi đã tìm ra nó, bởi vì khi tôi cố gắng làm với nó open('myfile.json', 'r'), và tôi đã FileNotFoundgặp lỗi, vì vậy tôi đã kiểm tra các đường dẫn.

Tôi đã không thể di chuyển myfile.json vào cùng một thư mục với sổ ghi chép của mình.

Thay đổi nó thành pd.read_json('../myfile.json')chỉ hoạt động.


1
Thật ngớ ngẩn khi nó cho một ValueError: Trailing datakhi nó nên cho một FileNotFound. Điều này cũng xảy ra với tôi.
ProGirlXOXO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.