একাধিক 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

আপনার কাছে একটি জেএসওএন লাইনের বিন্যাসের পাঠ্য ফাইল রয়েছে । আপনার ফাইল লাইনটি লাইন দিয়ে পার্স করতে হবে:

import json

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

প্রতিটি লাইনে বৈধ JSON রয়েছে, তবে সামগ্রিকভাবে, এটি কোনও বৈধ JSON মান নয় কারণ কোনও শীর্ষ-স্তরের তালিকা বা বস্তুর সংজ্ঞা নেই।

নোট করুন যেহেতু ফাইলটিতে প্রতি লাইনে JSON রয়েছে, আপনি একসাথে সবগুলি পার্স করার চেষ্টা করতে বা একটি স্ট্রিমিং জেএসএন পার্সার বের করার চেষ্টা করে মাথা ব্যথা সংরক্ষণ করেছেন। প্রক্রিয়াটিতে মেমরি সঞ্চয় করে আপনি এখন পরবর্তী লাইনে যাওয়ার আগে প্রতিটি লাইনকে আলাদাভাবে প্রক্রিয়া করতে বেছে নিতে পারেন। আপনি সম্ভবত এক লিস্টে প্রতিটি ফলাফল যোগ এবং চাই না তারপর সবকিছু প্রক্রিয়া যদি আপনার ফাইলটি সত্যিই বড়।

যদি আপনার মধ্যে পৃথক JSON অবজেক্টস অন্তর্ভুক্ত ডিলিমিটার সহ একটি ফাইল থাকে, তবে আমি কীভাবে একবারে একটি JSON অবজেক্টে পড়তে 'json' মডিউলটি ব্যবহার করব? একটি বাফার পদ্ধতি ব্যবহার করে পৃথক বস্তুগুলি বিশ্লেষণ করতে।


2
+1 সম্ভবত এটি লক্ষণীয় যে আপনার যদি একবারে সমস্ত বস্তুর প্রয়োজন না হয় তবে সেগুলির এক-এক করে প্রক্রিয়া করা আরও কার্যকর পদ্ধতির হতে পারে। এইভাবে আপনাকে মেমরিতে পুরো ডেটা সঞ্চয় করতে হবে না, তবে এটির একটি একক অংশ।
টেডেক

1
@ পাই_: আপনার একটি অভিধান থাকবে, সুতরাং কেবল কী হিসাবে ক্ষেত্রগুলি অ্যাক্সেস করুন:data = json.loads(line); print data[u'votes']
মার্টিজান পিটার

1
@ পাই_: তারপরে json.loads () এর ফলাফল মুদ্রণ করুন বা তদন্ত করতে ডিবাগারটি ব্যবহার করুন।
মার্টিজন পিটারস

1
@ পাই_: না; পাইথন ডিক উপস্থাপনার সাথে JSON ফর্ম্যাটটিকে বিভ্রান্ত করবেন না। আপনি এখন স্ট্রিং সহ পাইথন অভিধানগুলি দেখছেন।
মার্টিজন পিটারস

1
@ ব্যবহারকারী 2441441: পোস্ট থেকে লিঙ্কিত উত্তর দেখুন এখানে।
মার্টিজন পিটারস

11

এই প্রশ্নের জন্য যারা হোঁচট খাচ্ছেন তাদের জন্য: পাইথন jsonlinesলাইব্রেরি (এই প্রশ্নের তুলনায় অনেক কম বয়সী) মার্জিতভাবে প্রতি লাইনে একটি জেসন ডকুমেন্ট দিয়ে ফাইলগুলি পরিচালনা করে। দেখতে https://jsonlines.readthedocs.io/


4

যে হয় অসুস্থ বিন্যস্ত। প্রতি লাইনে আপনার কাছে একটি জেএসওএন অবজেক্ট রয়েছে তবে সেগুলি বৃহত্তর ডেটা স্ট্রাকচারে (যেমন একটি অ্যারে) থাকে না। আপনাকে এটির পুনরায় ফর্ম্যাট করতে হবে যাতে এটি প্রতিটি লাইনের শেষে কমা দিয়ে শুরু হয় [এবং শেষ হয় ]বা পৃথক অভিধান হিসাবে লাইনটি পার্স করে।


20
50 এমবি ফাইলের সাথে ওপি সম্ভবত লাইন দিয়ে ডেটা লাইন নিয়ে কাজ করা ভাল। :-)
মার্টিজান পিটারস

11
ফাইলটি খারাপ-ফর্ম্যাট করা হয়েছে কিনা তা তার দৃষ্টিভঙ্গির উপর নির্ভর করে। যদি এটি "জেএসএন লাইনগুলি" ফর্ম্যাটে থাকার কথা ছিল তবে তা বৈধ। দেখুন: jsonlines.org
LS
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.