JSON অবজেক্টটি বাইটগুলি গ্রহণ করতে দিন বা urlopen আউটপুট স্ট্রিংগুলিকে দিন


177

পাইথন 3 এর সাথে আমি একটি ইউআরএল থেকে জসন নথির অনুরোধ করছি।

response = urllib.request.urlopen(request)

responseবস্তুর সঙ্গে একটি ফাইল মত অবজেক্ট readএবং readlineপদ্ধতি। পাঠ্য মোডে খোলা একটি ফাইল দিয়ে সাধারণত একটি JSON অবজেক্ট তৈরি করা যায়।

obj = json.load(fp)

আমি যা করতে চাই তা হ'ল:

obj = json.load(response)

এটি অবশ্য কাজ করে না কারণ urlopen বাইনারি মোডে কোনও ফাইল অবজেক্ট দেয়।

চারপাশের কাজ অবশ্যই:

str_response = response.read().decode('utf-8')
obj = json.loads(str_response)

তবে এটা খারাপ লাগছে ...

এর চেয়ে আরও ভাল উপায় কি আমি বাইট ফাইল অবজেক্টকে স্ট্রিং ফাইল অবজেক্টে রূপান্তর করতে পারি? অথবা আমি উভয়ের জন্য কোনও প্যারামিটার মিস করছি urlopenবা json.loadএকটি এনকোডিং দেওয়ার জন্য?


2
আমার মনে হয় সেখানে আপনার টাইপো আছে, "রিডল" "পড়া" হওয়া উচিত?
বব ইওপ্লেট

পছন্দ করেছেন
ক্যাপ্টেননিমো

উত্তর:


79

এইচটিটিপি বাইট পাঠায়। যদি প্রশ্নে থাকা সংস্থানটি পাঠ্য হয় তবে অক্ষর এনকোডিংটি সাধারণত কন্টেন্ট-টাইপ HTTP শিরোনাম বা অন্য কোনও ব্যবস্থার (একটি আরএফসি, এইচটিএমএল meta http-equiv, ...) দ্বারা নির্দিষ্ট করা হয়।

urllib বাইটগুলি কোনও স্ট্রিংয়ে কীভাবে এনকোড করা উচিত তা জানা উচিত , তবে এটি খুব নির্বোধ — এটি একটি ভয়াবহভাবে আন্ডার পাওয়ার্ড এবং অন-পাইথোনিক লাইব্রেরি।

পাইথ ইন্ট পাইথন 3 পরিস্থিতি সম্পর্কে একটি ওভারভিউ সরবরাহ করে।

আপনার "কাজের আশপাশ" ঠিক আছে — যদিও এটি ভুল মনে হলেও এটি করার সঠিক উপায়।


6
এটি করার জন্য এটি "সঠিক" উপায় হতে পারে তবে পাইথন 3 সম্পর্কে আমি যদি একটি জিনিস পূর্বাবস্থায় ফিরিয়ে দিতে পারি তবে এটি হতে পারে এই বাইটস / স্ট্রিং ক্র্যাপ। আপনি অন্তর্নির্মিত গ্রন্থাগার ফাংশনগুলি অন্তত অন্তর্নির্মিত অন্যান্য লাইব্রেরি ফাংশনগুলি কীভাবে মোকাবেলা করতে হবে তা জানতে পারে। আমরা পাইথনটি যে কারণে ব্যবহার করি তার একটি অংশ হ'ল সহজ স্বজ্ঞাত বাক্য গঠন। এই পরিবর্তনটি পুরো জায়গাতেই ভেঙে যায়।
ThatAintWorking

4
পরীক্ষা করে দেখুন "অনুরোধ" গ্রন্থাগার - এটা স্বয়ংক্রিয়ভাবেই আপনার আপনার জন্য আর এই সাজানোর পরিচালনা করে।
অফবি 1

2
এটি বিল্ট-ইন লাইব্রেরি ফাংশনের ক্ষেত্রে নয় যে অন্যান্য ফাংশনগুলির সাথে ডিল করতে "কীভাবে" তা জানা দরকার। জেএসএনকে বস্তুর UTF-8 উপস্থাপনা হিসাবে সংজ্ঞায়িত করা হয়, সুতরাং এটি জাদুকরভাবে বাইটগুলি ডিকোড করতে পারে না যে এটি এনকোডিংটি জানেন না। আমি সম্মত হই যে urlopenবাইটগুলি নিজেই ডিকোড করতে সক্ষম হওয়া উচিত কারণ এটি এনকোডিংটি জানে। যাইহোক, আমি উত্তর হিসাবে পাইথন স্ট্যান্ডার্ড লাইব্রেরি সমাধান পোস্ট করেছি - আপনি codecsমডিউলটি ব্যবহার করে বাইটগুলির স্ট্রিমিং ডিকোডিং করতে পারেন ।
jbg

1
@ থ্যাট অ্যান্ট ওয়ার্কিং: আমি একমত নন বাইটস এবং স্ট্রিংয়ের মধ্যে পার্থক্যটি স্পষ্টভাবে পরিচালনা করতে ঘাড়ে ব্যথা হওয়া সত্ত্বেও, ভাষাটি আপনার জন্য কিছু স্পষ্ট রূপান্তর করতে আরও বেশি ব্যথা হয়। অন্তর্নিহিত বাইটস <-> স্ট্রিং রূপান্তরগুলি অনেকগুলি বাগের উত্স, এবং পাইথন 3 সমস্যাগুলি চিহ্নিত করতে খুব সহায়ক। তবে আমি সম্মত হই যে গ্রন্থাগারের এই অঞ্চলে উন্নতির সুযোগ রয়েছে।
EvertW

@EversW ব্যর্থতা, আমার মতে, এটি স্ট্রিংগুলি প্রথম স্থানটিতে ইউনিকোড হতে বাধ্য করে।
ThatAintWorking

99

পাইথনের দুর্দান্ত স্ট্যান্ডার্ড লাইব্রেরিটি উদ্ধার করার জন্য…

import codecs

reader = codecs.getreader("utf-8")
obj = json.load(reader(response))

পাই 2 এবং পাই 3 উভয়ের সাথে কাজ করে।

দস্তাবেজ: পাইথন 2 , Python3


11
এই উত্তরটি চেষ্টা করার সময় আমি নিশ্চিত হয়েছি কেন এই ত্রুটিটি পেয়েছি python 3.4.3? ত্রুটিটি ছিলTypeError: the JSON object must be str, not 'StreamReader'
অ্যারন লেলেভিয়ার

9
@ অ্যারোনইসিডোরো আপনি কি তার json.loads()পরিবর্তে সম্ভবত ব্যবহার করেছেন json.load()?
স্লিডক্যাল

6
বোনাস পয়েন্ট, এর পরিবর্তে UTF-8 অভিমানী এর এনকোডিং প্রতিক্রিয়ায় নিদিষ্ট ব্যবহার করুন: response.headers.get_content_charset()। রিটার্নস Noneকোন এনকোডিং আছে, এবং python2 উপর কোন অস্তিত্ব নেই।
ফিল ফ্রস্ট

5
পছন্দ করেছেন বাস্তবে এটির সাথে সাবধানতা অবলম্বন করতে পারে; JSON সর্বদা সংজ্ঞা অনুসারে UTF-8, UTF-16 বা UTF-32 হয় (এবং অত্যধিকভাবে UTF-8 হওয়ার সম্ভাবনা থাকে), সুতরাং যদি ওয়েব সার্ভার দ্বারা অন্য কোনও এনকোডিং ফিরে আসে তবে এটি সম্ভবত ওয়েব সার্ভার সফ্টওয়্যারটির পরিবর্তে কোনও ভুল কনফিগারেশন রয়েছে সত্যই অ-মানক JSON।
jbg

6
আমি যখন অজগর 3.5 ব্যবহার করতাম তখন ত্রুটিটি ছিল "অ্যাট্রিবিউটআরার: 'বাইটস' অবজেক্টটির 'পড়ুন'" এর কোনও বৈশিষ্ট্য নেই
হার্পার কো

66

আমি মতামত এসেছি যে প্রশ্নের সেরা উত্তর :)

import json
from urllib.request import urlopen

response = urlopen("site.com/api/foo/bar").read().decode('utf8')
obj = json.loads(response)

18

requestsলাইব্রেরি ব্যবহার করে অন্য যে কেউ এটি সমাধান করার চেষ্টা করছেন :

import json
import requests

r = requests.get('http://localhost/index.json')
r.raise_for_status()
# works for Python2 and Python3
json.loads(r.content.decode('utf-8'))

12
এই কার্যকারিতাটি অন্তর্নির্মিত requests: আপনি কেবল পারেনr.json()
jbg

1
পরিষ্কার করুন, আপনি @ jbg এর পদ্ধতিটি ব্যবহার করেন, আপনাকে করার দরকার নেই json.loads। আপনাকে যা করতে হবে তা হ'ল r.json()এবং আপনার জাসন অবজেক্টটি ইতিমধ্যে একটি ডিকের মধ্যে লোড পেয়েছে।
ব্লেয়ারজ 23

*** UnicodeEncodeError: 'ascii' codec can't encode characters in position 264-265: ordinal not in range(128)
andilabs

13

এটি আমার জন্য কাজ করে, আমি মানুষের জন্য অনুরোধেjson() ডকটি পরীক্ষা করে 'অনুরোধ' লাইব্রেরি ব্যবহার করি

import requests

url = 'here goes your url'

obj = requests.get(url).json() 

এই হল সর্বোত্তম উপায়। সত্যই পাঠযোগ্য এবং যে কেউ এরকম কিছু করছে তার অনুরোধ থাকা উচিত have
বাল্ড্রিক 24

6

আমি পাইথন 3.4.3 এবং 3.5.2 এবং জ্যাঙ্গো 1.11.3 ব্যবহার করে একই ধরণের সমস্যায় পড়েছি। যাইহোক, আমি পাইথন 3.6.1 এ আপগ্রেড করলে সমস্যাগুলি চলে যায়।

আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: https://docs.python.org/3/whatsnew/3.6.html#json

যদি আপনি পাইথনের একটি নির্দিষ্ট সংস্করণে আবদ্ধ না হন তবে কেবল 3.6 বা তার পরে উন্নীত করার বিষয়টি বিবেচনা করুন।


3

ফ্ল্যাশ মাইক্রোফ্রেমওয়ার্ক ব্যবহার করে আপনি যদি এই সমস্যাটির সম্মুখীন হন তবে আপনি কেবল এটি করতে পারেন:

data = json.loads(response.get_data(as_text=True))

দস্তাবেজগুলি থেকে : "যদি as_text সত্য হিসাবে সেট করা থাকে তবে ফেরতের মানটি ডিকোডড ইউনিকোড স্ট্রিং হবে"


আমি এই পৃষ্ঠায় পৌঁছেছি কারণ ফ্লাস্ক ইউনিট পরীক্ষাগুলিতে আমার একটি সমস্যা ছিল - একক লাইন কল পোস্ট করার জন্য ধন্যবাদ।
sfblackl

1

আপনার কর্মক্ষেত্রটি আসলে আমাকে বাঁচিয়েছে। ফ্যালকন ফ্রেমওয়ার্ক ব্যবহার করে অনুরোধটি প্রক্রিয়াকরণ করতে আমার অনেক সমস্যা হয়েছিল। এটি আমার পক্ষে কাজ করেছে। অনুরোধ ফর্ম কার্ল PR httpie হচ্ছে

json.loads(req.stream.read().decode('utf-8'))

1

এটি জসনগুলিতে বাইট ডেটা প্রবাহিত করবে।

import io

obj = json.load(io.TextIOWrapper(response))

io.TextIOWrapper কোডেকের মডিউল পাঠকের পক্ষে পছন্দনীয়। https://www.python.org/dev/peps/pep-0400/


`*** বৈশিষ্ট্য
ত্রুটি

*** অ্যাট্রিবিউটআরার: 'বাইটস' অবজেক্টটির কোনও 'পঠনযোগ্য' বৈশিষ্ট্য নেই
অ্যান্ডিলাবস

আপনি urllib বা অনুরোধ ব্যবহার করছেন? এটি urllib এর জন্য। আপনার যদি বাইটস অবজেক্ট থাকে তবে কেবল ব্যবহার করুন json.loads(bytes_obj.decode())
কলিন অ্যান্ডারসন

0

এইচটিপিআরস্পোনস সামগ্রীটিকে জসন হিসাবে তৈরি করার জন্য সবেমাত্র এই সহজ পদ্ধতিটি খুঁজে পেয়েছি

import json

request = RequestFactory() # ignore this, this just like your request object

response = MyView.as_view()(request) # got response as HttpResponse object

response.render() # call this so we could call response.content after

json_response = json.loads(response.content.decode('utf-8'))

print(json_response) # {"your_json_key": "your json value"}

আশা করি আপনাকে সাহায্য করবে


0

পাইথন ৩.6 অনুসারে, আপনি সরাসরি json.loads()কোনও bytesঅবজেক্টকে ডিসরিয়ালাইজ করতে ব্যবহার করতে পারেন (এনকোডিংটি অবশ্যই UTF-8, UTF-16 বা UTF-32 হতে হবে)। সুতরাং, স্ট্যান্ডার্ড লাইব্রেরি থেকে কেবলমাত্র মডিউল ব্যবহার করে আপনি এটি করতে পারেন:

import json
from urllib import request

response = request.urlopen(url).read()
data = json.loads(response)

-2

আমি ব্যবহার করতে নীচে প্রোগ্রাম ব্যবহার json.loads()

import urllib.request
import json
endpoint = 'https://maps.googleapis.com/maps/api/directions/json?'
api_key = 'AIzaSyABbKiwfzv9vLBR_kCuhO7w13Kseu68lr0'
origin = input('where are you ?').replace(' ','+')
destination = input('where do u want to go').replace(' ','+')
nav_request = 'origin={}&destination={}&key={}'.format(origin,destination,api_key)
request = endpoint + nav_request
response = urllib.request.urlopen(request).read().decode('utf-8')
directions = json.loads(response)
print(directions)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.