سؤال

أريد معالجة المعلومات في هذا عنوان URL.يمكنني فتحه بنجاح وقراءة محتوياته.لكن ما أريد فعله حقًا هو التخلص من كل الأشياء التي لا أريدها، والتلاعب بالأشياء التي أريد الاحتفاظ بها.

هل هناك طريقة لتحويل السلسلة إلى إملاء حتى أتمكن من التكرار عليها؟أم هل عليّ فقط تحليلها كما هي (نوع str)؟

from urllib.request import urlopen

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)

print(response.read()) # returns string with info
هل كانت مفيدة؟

المحلول

عندما طبعت response.read() لاحظت ذلك b تم تقديمه مسبقًا إلى السلسلة (على سبيل المثال b'{"a":1,..).يشير الحرف "b" إلى البايتات ويعمل بمثابة تعريف لنوع الكائن الذي تتعامل معه.منذ ذلك الحين، كنت أعرف أنه يمكن تحويل السلسلة إلى إملاء باستخدام json.loads('string'), ، كان عليّ فقط تحويل نوع البايت إلى نوع سلسلة.لقد فعلت ذلك عن طريق فك تشفير الاستجابة لـ utf-8 decode('utf-8').بمجرد وجوده في نوع سلسلة، تم حل مشكلتي وتمكنت بسهولة من التكرار عبر ملف dict.

لا أعرف ما إذا كانت هذه هي الطريقة الأسرع أو الأكثر "بيثونية" لكتابة هذا ولكنها تعمل وهناك دائمًا وقت لاحق للتحسين والتحسين!الكود الكامل للحل الخاص بي:

from urllib.request import urlopen
import json

# Get the dataset
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)

# Convert bytes to string type and string type to dict
string = response.read().decode('utf-8')
json_obj = json.loads(string)

print(json_obj['source_name']) # prints the string with 'source_name' key

نصائح أخرى

يمكنك أيضا استخدام مكتبة طلبات Python بدلا من ذلك.

giveacodicetagpre.

الآن يمكنك التعامل مع "Dict" مثل قاموس Python.

json يعمل مع نص Unicode في Python 3 (يتم تعريف تنسيق JSON نفسه فقط من حيث نص Unicode) وبالتالي تحتاج إلى فك تشفير البايتات المستلمة في استجابة HTTP. r.headers.get_content_charset('utf-8') يحصل على ترميز الأحرف الخاص بك:

#!/usr/bin/env python3
import io
import json
from urllib.request import urlopen

with urlopen('https://httpbin.org/get') as r, \
     io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file:
    result = json.load(file)
print(result['headers']['User-Agent'])

ليس من الضروري استخدامه io.TextIOWrapper هنا:

#!/usr/bin/env python3
import json
from urllib.request import urlopen

with urlopen('https://httpbin.org/get') as r:
    result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8')))
print(result['headers']['User-Agent'])

أعتقد أن الأمور قد تغيرت في بيثون 3.4.هذا عملت بالنسبة لي:

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top