ठीक है, तो मैं पिछले 2 दिनों से इस पर अपना सिर पीट रहा हूं, कोई वास्तविक प्रगति नहीं हुई है। मैं सामान्य रूप से अजगर और कोडिंग के साथ एक नौसिखिया हूं, लेकिन यह पहला मुद्दा है जिसे मैं स्वयं हल नहीं कर पाया हूं।

तो मेरे पास youtubeapi से लगभग 7000 प्रविष्टियों के साथ JSON स्वरूपण के साथ यह लंबी फ़ाइल है। अभी मैं एक निश्चित शब्दकोश कुंजी (जिसे 'कुंजी' कहा जाता है) के लिए कुछ जानकारी ('वीडियो आईडी') मुद्रित करने के लिए एक छोटी स्क्रिप्ट रखना चाहता हूं:

मेरी स्क्रिप्ट:

import json

f = open ('path file.txt', 'r')
s = f.read()

trailers = json.loads(s)
print(trailers['key']['Items']['id']['videoId'])
# print(trailers['key']['videoId'] gives same response

त्रुटि:

print(trailers['key']['Items']['id']['videoId'])
TypeError: string indices must be integers

यह तब काम करता है जब मैं शब्दकोश कुंजी के लिए सभी जानकारी मुद्रित करना चाहता हूं: यह स्क्रिप्ट काम करती है

import json

f = open ('path file.txt', 'r')
s = f.read()

trailers = json.loads(s)
print(trailers['key'])

साथ ही प्रिंट (टाइप (ट्रेलर)) का परिणाम क्लास 'डिक्टेट' में होता है, जैसा कि माना जाता है।

मेरी JSON फ़ाइल इस तरह स्वरूपित है और youtube API, youtube#searchListResponse से है।

{
 "kind": "youtube#searchListResponse",
 "etag": "",
 "nextPageToken": "",
 "regionCode": "",
 "pageInfo": {
  "totalResults": 1000000,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#searchResult",
   "etag": "",
   "id": {
    "kind": "youtube#video",
    "videoId": ""
   },
   "snippet": {
    "publishedAt": "",
    "channelId": "",
    "title": "",
    "description": "",
    "thumbnails": {
     "default": {
      "url": "",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "",
    "liveBroadcastContent": "none"
   }
  }
 ]
}

समस्या को समझने के लिए आपको और कौन सी जानकारी देने की आवश्यकता है?

1
Lourens 30 मई 2017, 21:06
1
क्या आप print(trailers['key']['items'][0]['id']['videoId']) कोशिश कर सकते हैं क्योंकि items तानाशाही की एक सूची है
 – 
pramod
30 मई 2017, 21:09
1
1. "आइटम" लोअरकेस होना चाहिए, है ना? 2. ध्यान दें कि कैसे "आइटम" में वस्तुओं की एक सूची होती है, एक भी वस्तु नहीं।
 – 
Carcigenicate
30 मई 2017, 21:10
एक तरफ, आपको केवल with open('path file.txt') as f: trailers = json.load(f) का उपयोग करना चाहिए
 – 
juanpa.arrivillaga
30 मई 2017, 21:13
@ juanpa.arrivillaga वही बात है लेकिन अधिक 'पायथनी' सही लिखा है? उद्देश्य पर json.loads के बजाय json.load भी है?
 – 
Lourens
30 मई 2017, 21:27
हाँ यह होना चाहिए, इसे बदल दिया। मुझे लगता है कि यह सच है, लेकिन मैं उस पर कैसे कार्रवाई करूं?
 – 
Lourens
30 मई 2017, 21:30

3 जवाब

सबसे बढ़िया उत्तर

निम्नलिखित कोड मुझे प्रदान किए गए नमूना डेटा से सभी वीडियो आईडी देता है (जो वास्तव में कोई आईडी नहीं है):

import json

with open('sampledata', 'r') as datafile:
    data = json.loads(datafile.read())
print([item['id']['videoId'] for item in data['items']])

शायद आप इसे अधिक डेटा के साथ आजमा सकते हैं।

उम्मीद है ये मदद करेगा।

2
Bart Van Loon 5 सितंबर 2017, 19:37
आपको जवाब के लिए धन्यवाद! यह वास्तव में जाने का रास्ता है, मुझे लगा कि इस धागे के मरने के कुछ दिनों बाद मैं खुद को समझ गया। विशिष्ट होने के लिए, समस्या यह थी कि मेरे पास 1 टेक्स्टफाइल था जिसमें सभी 7000 एपीआई परिणामों का एक शब्दकोश था। मुझे शब्दकोश में प्रत्येक प्रविष्टि (एपीआई परिणाम) पर json.loads करना चाहिए था। मूर्खतापूर्ण गलतियाँ, लेकिन सुपर भ्रमित करने वाली जब मैंने कोडिंग शुरू की।
 – 
Lourens
5 सितंबर 2017, 23:47
हे, हाँ, समझ में आता है। क्या आपने पहले ही अपने पायथन टूलकिट में ptpython और pudb जोड़ लिए हैं? वे भविष्य में इन चीजों को जल्दी ठीक करने में आपकी मदद कर सकते हैं। आनंद लेना!
 – 
Bart Van Loon
6 सितंबर 2017, 12:03

मैंने वास्तव में यूट्यूब एपीआई में नहीं देखा लेकिन कोड और आपके द्वारा दिए गए नमूने को देखकर ऐसा लगता है कि आप [0] चूक गए हैं। जेसन की संरचना को देखते हुए कुंजी आइटम में एक सूची है।

import json

f = open ('json1.json', 'r')
s = f.read()

trailers = json.loads(s)
print(trailers['items'][0]['id']['videoId'])
0
Benson Chang 30 मई 2017, 21:20
यह मानते हुए कि आप ['कुंजी'] भूल जाते हैं, लेकिन मुझे अभी भी वही त्रुटि मिलती है। हालांकि मुझे लगता है कि यह असंबंधित है, मैं एक .txt फ़ाइल से आयात कर रहा हूं। समस्या नहीं होनी चाहिए, है ना?
 – 
Lourens
30 मई 2017, 21:39
मैंने जानबूझकर ['कुंजी'] छोड़ दिया क्योंकि आपके द्वारा दिए गए नमूने में कोई 'कुंजी' नहीं है। और हाँ, आप एक .txt फ़ाइल का उपयोग कर सकते हैं। BTW आप हमेशा कोशिश कर सकते हैं trailers['items'], trailers['items'][0], trailers['items'][0]['id'] ...
 – 
Benson Chang
31 मई 2017, 01:00

मैंने पहले जेसन का उपयोग नहीं किया है। लेकिन यह मूल रूप से अधिक dicts, सूचियों आदि के साथ dicts के रूप में आयात किया जाता है। जहां लागू हो। कम से कम मेरी समझ से।

तो जब आप type(trailers) करते हैं तो आपको टाइप डिक्ट मिलता है। फिर आप trailers['key'] के साथ dict करते हैं। यदि आप इसे टाइप करते हैं, तो यह भी एक निर्देश होना चाहिए, अगर चीजें सही तरीके से काम करती हैं। प्रत्येक निर्देश में वस्तुओं के माध्यम से काम करना अंत में आपकी त्रुटि का पता लगाना चाहिए।

पायथन त्रुटि कहती है कि आप एक स्ट्रिंग के इंडेक्स/इंडेक्स को खोजने का प्रयास कर रहे हैं, जो केवल पूर्णांक स्वीकार करता है, जबकि आप एक ताना का उपयोग करने का प्रयास कर रहे हैं। तो आपको यह पता लगाना होगा कि प्रत्येक तर्क का उपयोग करते समय आपको स्ट्रिंग क्यों मिल रही है और ताना नहीं है।

एक उदाहरण जोड़ने के लिए संपादित करें। यदि आपके निर्देश में कुंजी 'आइटम' पर एक स्ट्रिंग है, तो आपको बदले में एक स्ट्रिंग मिलती है, न कि एक नया निर्देश जिसे आप आगे से एक निर्देश प्राप्त कर सकते हैं। item उदाहरण के लिए, जोंस में, एक सूची प्रतीत होती है, जिसमें डिक्ट्स होते हैं। खुद एक तानाशाही नहीं।

0
Thomasedv 30 मई 2017, 21:24
मुझे लगता है कि मुझे आपके उत्तर में समस्या मिल गई है, अगर मैं type(trailers['key']) करता हूं तो मुझे टाइप str. एक सूची भी नहीं, इसलिए मैं इसे अनुक्रमित नहीं कर सकता, इसे केवल एक ही वर्ण मिलेगा।
 – 
Lourens
30 मई 2017, 22:12
इसलिए, जब आप संपूर्ण trailer प्रिंट करते हैं, तो क्या यह दिखाता है कि 'कुंजी' कुंजी के नीचे क्या है? क्या आप print(trailer) के लिए छपी हर चीज़ को दिखाने के लिए प्रश्न को संपादित कर सकते हैं?
 – 
Thomasedv
30 मई 2017, 22:35