कई JSON ऑब्जेक्ट्स के साथ JSON फ़ाइल को लोड और पार्स करना


101

मैं पायथन में एक JSON फ़ाइल लोड और पार्स करने का प्रयास कर रहा हूं । लेकिन मैं फ़ाइल को लोड करने की कोशिश कर रहा हूँ:

import json
json_data = open('file')
data = json.load(json_data)

पैदावार:

ValueError: Extra data: line 2 column 1 - line 225116 column 1 (char 232 - 160128774)

मैंने 18.2 कोjson देखा - जेन्सन एनकोडर और डिकोडर पाइथन डॉक्यूमेंटेशन में, लेकिन इस भयानक दिखने वाले डॉक्यूमेंटेशन के माध्यम से पढ़ना बहुत हतोत्साहित करने वाला है।

पहली कुछ पंक्तियाँ (यादृच्छिक प्रविष्टियों के साथ अनाम):

{"votes": {"funny": 2, "useful": 5, "cool": 1}, "user_id": "harveydennis", "name": "Jasmine Graham", "url": "http://example.org/user_details?userid=harveydennis", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 2, "cool": 4}, "user_id": "njohnson", "name": "Zachary Ballard", "url": "https://www.example.com/user_details?userid=njohnson", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 0, "cool": 4}, "user_id": "david06", "name": "Jonathan George", "url": "https://example.com/user_details?userid=david06", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 6, "useful": 5, "cool": 0}, "user_id": "santiagoerika", "name": "Amanda Taylor", "url": "https://www.example.com/user_details?userid=santiagoerika", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 8, "cool": 2}, "user_id": "rodriguezdennis", "name": "Jennifer Roach", "url": "http://www.example.com/user_details?userid=rodriguezdennis", "average_stars": 3.5, "review_count": 12, "type": "user"}

जवाबों:


222

आपके पास एक JSON लाइन्स फॉर्मेट टेक्स्ट फाइल है । आपको अपनी फ़ाइल लाइन को लाइन से पार्स करने की आवश्यकता है:

import json

data = []
with open('file') as f:
    for line in f:
        data.append(json.loads(line))

प्रत्येक पंक्ति में वैध JSON होता है, लेकिन एक संपूर्ण के रूप में, यह एक मान्य JSON मान नहीं है क्योंकि कोई शीर्ष-स्तरीय सूची या ऑब्जेक्ट परिभाषा नहीं है।

ध्यान दें कि क्योंकि फ़ाइल में JSON प्रति पंक्ति है, आप सभी को एक बार में पार्स करने या स्ट्रीमिंग JSON पार्सर का पता लगाने की कोशिश कर रहे हैं। अब आप अगली पंक्ति में जाने से पहले प्रत्येक पंक्ति को अलग से संसाधित करने का विकल्प चुन सकते हैं, प्रक्रिया में मेमोरी को बचा सकते हैं। आप शायद एक ही सूची में प्रत्येक परिणाम संलग्न करें और नहीं करना चाहते तो सब कुछ पर कार्रवाई करता है, तो आपकी फ़ाइल वास्तव में बड़ा है।

यदि आपके पास डिलिमिटर्स के बीच में व्यक्तिगत JSON ऑब्जेक्ट वाली फ़ाइल है, तो मैं एक समय में एक JSON ऑब्जेक्ट में पढ़ने के लिए 'json' मॉड्यूल का उपयोग कैसे करूं? एक बफर विधि का उपयोग करके अलग-अलग वस्तुओं को पार्स करने के लिए।


2
+1 शायद यह ध्यान देने योग्य है, कि यदि आपको एक साथ सभी वस्तुओं की आवश्यकता नहीं है, तो उन्हें एक-एक करके संसाधित करना अधिक कुशल दृष्टिकोण हो सकता है। इस तरह आपको मेमोरी में पूरे डेटा को स्टोर करने की आवश्यकता नहीं होगी, लेकिन इसका एक टुकड़ा।
ताडेक

1
@Pi_: यदि आप एक शब्दकोश होगा, तो बस कुंजी के रूप में क्षेत्रों का उपयोग:data = json.loads(line); print data[u'votes']
मार्टिन पीटर्स

1
@Pi_: json.loads () के परिणाम को प्रिंट करें या फिर निरीक्षण करने के लिए डीबगर का उपयोग करें।
मार्टिन पीटर्स

1
@Pi_: नहीं; अजगर तानाशाही प्रतिनिधित्व के साथ JSON प्रारूप को भ्रमित न करें। अब आप स्ट्रिंग्स के साथ अजगर शब्दकोशों देख रहे हैं।
मार्टिन पीटर्स

1
@ user2441441: यहां पोस्ट से लिंक किए गए उत्तर देखें ।
मार्टिन पीटर्स

11

इस सवाल पर ठोकर खाने वालों के लिए: अजगर jsonlinesपुस्तकालय (इस सवाल से बहुत छोटा) प्रति पंक्ति एक जोंस दस्तावेज़ के साथ सुरुचिपूर्ण ढंग से फ़ाइलों को संभालता है। देख https://jsonlines.readthedocs.io/


4

यही कारण है कि है बीमार स्वरूपित। आपके पास प्रति पंक्ति एक JSON ऑब्जेक्ट है, लेकिन वे एक बड़ी डेटा संरचना (यानी एक सरणी) में निहित नहीं हैं। आपको या तो इसे पुन: स्वरूपित करने की आवश्यकता होगी ताकि यह प्रत्येक पंक्ति के अंत में अल्पविराम के [साथ शुरू हो और समाप्त हो ], या इसे अलग-अलग शब्दकोशों के रूप में पंक्ति द्वारा पंक्तिबद्ध करें।


20
50 एमबी फ़ाइल के साथ ओपी संभवतः लाइन द्वारा डेटा लाइन से निपटने के लिए बेहतर है। :-)
मार्टिन पीटर्स

11
क्या फ़ाइल अ-स्वरूपित है, किसी के दृष्टिकोण पर निर्भर करती है। यदि यह "JSON लाइनों" प्रारूप में होने का इरादा था, तो यह मान्य है। देखें: jsonlines.org
LS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.