การโหลดไฟล์ที่มี JSON มากกว่าหนึ่งบรรทัดลงใน Pandas


94

ฉันพยายามอ่านไฟล์ JSON ในกรอบข้อมูล Python pandas (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ข้อผิดพลาด? ฉันจะอ่านลงใน data frame ได้อย่างไร

ทำตามคำแนะนำต่อไปนี้เป็นสองสามบรรทัดของไฟล์. 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
Martijn Pieters

ไฟล์ json สองสามบรรทัดสุดท้ายมีลักษณะอย่างไร
Bryan Oakley

2
ตัวอย่างนี้อ่านได้ดีสำหรับฉันในแพนด้า 0.16.0 คุณใช้แพนด้ารุ่นอะไร?
Andy Hayden

1
@ user62198 อัปเดตเป็น 0.16.0 มีการแก้ไขบางอย่างสำหรับ read_json
Andy Hayden

1
@ คอร์เนลกิบังฉันสามารถโหลดทั้งไฟล์หรืออ่านทีละบรรทัด ดูเหมือนว่าการแปลงเป็นรูปแบบที่คุณกล่าวถึงอาจเป็นเรื่องยากเล็กน้อยเนื่องจากมีระเบียนดังกล่าวมากกว่า 5 ล้านรายการ
user62198

คำตอบ:


242

จากเวอร์ชัน 0.19.0 ของ Pandas คุณสามารถใช้linesพารามิเตอร์ดังนี้:

import pandas as pd

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

มีความคิดอย่างไรในการแก้ไขปัญหานี้ที่เกี่ยวข้องกับlinesข้อโต้แย้งหรือไม่ github.com/pandas-dev/pandas/issues/15132
Chuck

33

คุณต้องอ่านทีละบรรทัด ตัวอย่างเช่นคุณสามารถใช้รหัสต่อไปนี้ที่ryptophan ให้ไว้บน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)

สวัสดีฉันกำลังพยายามอ่านไฟล์ un json และจัดเก็บลงใน dataframe อย่างไรก็ตามเมื่อฉันใช้รหัสของคุณฉันได้รับข้อผิดพลาด: "TypeError: ลำดับรายการ 0: อินสแตนซ์ str ที่คาดไว้, พบไบต์" คุณรู้ไหมว่ามันผิดอะไร?
ngoduyvu

3

รหัสต่อไปนี้ช่วยให้ฉันโหลด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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.