পাইথনে স্ট্রিং টু ডিকশনারি


126

সুতরাং আমি এটিতে অনেক সময় কাটিয়েছি, এবং এটি আমার কাছে মনে হয় এটি একটি সাধারণ সমাধান হওয়া উচিত। আমি আমার সাইটে ব্যবহারকারীদের নিবন্ধ করার জন্য ফেসবুকের প্রমাণীকরণটি ব্যবহার করার চেষ্টা করছি এবং এটি সার্ভারের পাশাপাশি করার চেষ্টা করছি। আমি যেখানে পৌঁছেছি আমার অ্যাক্সেস টোকেনটি পেয়েছি এবং আমি যখন এখানে যাচ্ছি:

https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN

স্ট্রিং হিসাবে আমি যে তথ্যটি সন্ধান করছি সেগুলি আমি এর মতো পাই:

{"id":"123456789","name":"John Doe","first_name":"John","last_name":"Doe","link":"http:\/\/www.facebook.com\/jdoe","gender":"male","email":"jdoe\u0040gmail.com","timezone":-7,"locale":"en_US","verified":true,"updated_time":"2011-01-12T02:43:35+0000"}

দেখে মনে হচ্ছে আমার এটি ব্যবহার করতে সক্ষম হওয়া উচিত dict(string)তবে আমি এই ত্রুটিটি পাচ্ছি:

ValueError: dictionary update sequence element #0 has length 1; 2 is required

সুতরাং আমি পিকল ব্যবহার করার চেষ্টা করেছি, তবে এই ত্রুটিটি পেয়েছি:

KeyError: '{'

আমি django.serializersএটি ডি-সিরিয়ালাইজ করার চেষ্টা করেছিলাম তবে এর মতো ফলাফল ছিল। কোন চিন্তা? আমার মনে হচ্ছে উত্তরটি সহজ হতে হবে এবং আমি কেবল বোকা হয়ে যাচ্ছি। কোন সাহায্যের জন্য ধন্যবাদ!


আপনি যদি পাইথন হিসাবে স্ট্রিংটি আবিষ্কার করতে চান "verified":trueতবে আপনার স্ট্রিংটি পরিবর্তন করতে হতে পারে: trueসংজ্ঞায়িত না হলে ব্যর্থ হয়। অথবা আপনি ব্যবহার করতে পারেন "verified":True, বা "verified":"true"
ম্যাট কার্টিস

2
@ ম্যাট: আমি সন্দেহ করি তিনি গ্রাফ.ফেসবুক.কমের আউটপুট ফর্ম্যাটটি পরিবর্তন করতে পারেন।
ফ্রেড নুরক

@ ফ্রেড: প্রশ্নের শিরোনাম দেওয়া ("স্ট্রিং টু ডিকশনারি ইন পাইথন"), আমি ধারণা করি তিনি কল করার আগে পাইথন থেকে এটি পরিবর্তন করতে পারেন ast.literal_eval()। আপনার (সংশোধিত) উত্তরটি সঠিক, যদিও - একটি জেএসএন ডিসরিয়ালাইজার একটি ভাল সমাধান।
ম্যাট কার্টিস

1
@ ম্যাটকুরিটিস: শক্তিশালী উপায়ে (ast.literal_eval এর আগে) এটি পরিবর্তন করার জন্য এটি প্রথমে JSON হিসাবে পার্সিংয়ের প্রয়োজন হবে। আমি ..literal_eval কে ওপি ডিক (কিছু_ স্ট্রিং) দিয়ে যা করার চেষ্টা করেছিল তা করার সঠিক উপায় হিসাবে উল্লেখ করেছি।
ফ্রেড নুরক

@ ফ্রেড: আমি মনে করি আমরা সম্মত হতে সম্মত হচ্ছি :-)
ম্যাট কার্টিস

উত্তর:


238

এই তথ্যটি JSON ! আপনি পাইথন ২.6++ তে অন্তর্নির্মিত jsonমডিউলটি ব্যবহার করে এটি ডিসরিয়ালাইজ করতে পারেন, অন্যথায় আপনি দুর্দান্ত তৃতীয় পক্ষের simplejsonমডিউলটি ব্যবহার করতে পারেন ।

import json    # or `import simplejson as json` if on Python < 2.6

json_string = u'{ "id":"123456789", ... }'
obj = json.loads(json_string)    # obj now contains a dict of the data

5
আপনি কেন uআপনার উদাহরণের সামনে JSON স্ট্রিং রেখেছিলেন ?
জন মাচিন

2
@ জন: এটি একটি ইউনিকোড স্ট্রিং নির্দেশ করে । আমি এটি বেশিরভাগ অভ্যাসের বাইরে রেখেছি, তবে সম্ভবত ফেসবুক এপিআই এতে নন-এসসিআইআই অক্ষর সহ ডেটা ফিরিয়ে দিতে পারে; সেক্ষেত্রে ডেটা এনকোড করা হবে (সম্ভবত ইউটিএফ -8 এ), এবং decode()এটির ফলে একটি unicodeস্ট্রিং পাওয়া যায় - যা আমি আমার উদাহরণে ব্যবহার করেছি। এছাড়াও, এই পৃষ্ঠায় উল্লেখ করা হয়েছে যে জেএসএন সর্বদা ইউনিকোডে থাকে (শব্দটির সন্ধান করুন, এটি প্রায় অর্ধেক নীচে নেমেছে)
ক্যামেরন

3
এটি পাইথনের একটি ছোট ইউ-ইউনিকোড আক্ষরিক নির্দেশ করে। অভ্যাস একটি ভাল কারণ নয়। "JSON পাঠ্যের অক্ষর এনকোডিং সর্বদা ইউনিকোড is" - [ইউইউ] নিকোড কোনও এনকোডিং নয়। Json.loads () যা প্রত্যাশা করে তা হ'ল আপনি "ওভার ওয়্যার" পেয়েছেন যা সাধারণত ASCII এ এনআরকড একটি স্ট্রিং অবজেক্ট। আপনি যেখানে json.loads () একটি ইউনিকোড বস্তুটি ইচ্ছাকৃতভাবে খাওয়াতেন কেবল সেই ক্ষেত্রেই যেখানে কোনও অদ্ভুত ব্যক্তি এটি ইউটিএফ -16 এ সঞ্চারিত করেছিল এবং নথি হিসাবে আপনাকে এটিকে নিজেই ডিকোড করতে হবে।
জন মাচিন

1
@ জন: হ্যাঁ, ছোট-ইউ unicodeহল পাইথন টাইপ, এতে ইউনিকোড (বিগ-ইউ যথাযথ বিশেষ্য) রয়েছে। আমি এটিও সম্মত করি যে ইউনিকোড মোটেও কোনও এনকোডিং নয়, সুতরাং সম্ভবত আমার এই পৃষ্ঠাটি একটি রেফারেন্স হিসাবে দেখানো উচিত নয়। unicodeস্ট্রিংগুলি এড়াতে কোনও কারণ নেই json.loads, যদিও - ডক্স স্পষ্টভাবে জানিয়েছে যে এটি পুরোপুরি গ্রহণযোগ্য এবং আমি প্রি-ডিকোডড স্ট্রিংটি আরও সুস্পষ্ট হিসাবে ব্যবহার করতে চাই like
ক্যামেরন

8
@ জন: পেডেন্টিক হওয়ার জন্য দুঃখিত, তবে এএসসিআইআই-তে এনকোড করা json.loads()কোনও strবস্তুর প্রত্যাশা করে না - এটি ইউটিএফ -8 এstr এনকোড করা কোনও বস্তু বা কোনও বস্তু (বা কোনও বস্তুটি একটি স্পষ্টত এনকোডিং) প্রত্যাশা করেunicodestr
ক্যামেরন

19

পাইথনের আক্ষরিক মূল্যায়ন করতে ast.literal_eval ব্যবহার করুন । যাইহোক, আপনার যা আছে তা হ'ল জেএসএন (উদাহরণস্বরূপ "সত্য" নোট করুন), সুতরাং একটি জেএসএন ডিসরিওলাইজার ব্যবহার করুন।

>>> import json
>>> s = """{"id":"123456789","name":"John Doe","first_name":"John","last_name":"Doe","link":"http:\/\/www.facebook.com\/jdoe","gender":"male","email":"jdoe\u0040gmail.com","timezone":-7,"locale":"en_US","verified":true,"updated_time":"2011-01-12T02:43:35+0000"}"""
>>> json.loads(s)
{u'first_name': u'John', u'last_name': u'Doe', u'verified': True, u'name': u'John Doe', u'locale': u'en_US', u'gender': u'male', u'email': u'jdoe@gmail.com', u'link': u'http://www.facebook.com/jdoe', u'timezone': -7, u'updated_time': u'2011-01-12T02:43:35+0000', u'id': u'123456789'}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.