मुझे क्यों दिखाई दे रहा है "TypeError: string सूचकांक होना चाहिए पूर्णांक"?


219

मैं दोनों सीखने के अजगर के साथ खेल रहा हूं और गीथब मुद्दों को एक पठनीय रूप में प्राप्त करने की कोशिश कर रहा हूं। मैं JSON को CSV में कैसे परिवर्तित कर सकता हूं, इस सलाह का उपयोग करना मैं इसके साथ आया:

import json
import csv

f=open('issues.json')
data = json.load(f)
f.close()

f=open("issues.csv","wb+")
csv_file=csv.writer(f)

csv_file.writerow(["gravatar_id","position","number","votes","created_at","comments","body","title","updated_at","html_url","user","labels","state"])

for item in data:
        csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])

जहाँ "issues.json" json फ़ाइल है जिसमें मेरे github मुद्दे हैं। जब मैं उसे चलाने की कोशिश करता हूं, मुझे मिलता है

File "foo.py", line 14, in <module>
csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])

TypeError: string indices must be integers

मुझे यहां क्या समझ नहीं आ रहा है? "स्ट्रिंग इंडेक्स" कौन से हैं? मुझे यकीन है कि एक बार जब मुझे यह काम मिल जाएगा तो मेरे पास और मुद्दे होंगे, लेकिन अभी के लिए, मैं इस काम के लिए प्यार करूंगा!

जब मैं forबयान को बस के लिए कहता हूं

for item in data:
    print item

मुझे जो मिल रहा है ... "मुद्दे" - इसलिए मैं कुछ और गलत कर रहा हूं। यहाँ मेरा एक सा है:

{"issues":[{"gravatar_id":"44230311a3dcd684b6c5f81bf2ec9f60","position":2.0,"number":263,"votes":0,"created_at":"2010/09/17 16:06:50 -0700","comments":11,"body":"Add missing paging (Older>>) links...

जब मैं प्रिंट dataकरता हूं तो ऐसा लगता है कि यह वास्तव में अजीब तरह से घुल रहा है:

{u'issues': [{u'body': u'Add missing paging (Older>>) lin...

क्या आप याद कर रहे हैं है print repr(data)याimport pprint; pprint.pprint(data)
जॉन Machin

जवाबों:


116

itemआपके कोड में सबसे अधिक संभावना है; स्ट्रिंग सूचकांकों में वर्ग कोष्ठक, जैसे gravatar_id। इसलिए मैं सबसे पहले आपके dataचर की जांच करूंगा कि आपको वहां क्या मिला; मुझे लगता है कि dataयह तार की एक सूची है (या कम से कम एक स्ट्रिंग वाली कम से कम एक सूची) जबकि यह शब्दकोशों की एक सूची होनी चाहिए।


158

चर itemएक स्ट्रिंग है। एक सूचकांक इस तरह दिखता है:

>>> mystring = 'helloworld'
>>> print mystring[0]
'h'

उपरोक्त उदाहरण 0पहले वर्ण को संदर्भित करने के लिए स्ट्रिंग के सूचकांक का उपयोग करता है ।

स्ट्रिंग्स में स्ट्रिंग इंडेक्स नहीं हो सकते हैं (जैसे शब्दकोशों कर सकते हैं)। तो यह काम नहीं करेगा:

>>> mystring = 'helloworld'
>>> print mystring['stringindex']
TypeError: string indices must be integers

42

dataएक dictवस्तु है। तो, इसे इस तरह से iterate:

अजगर २

for key, value in data.iteritems():
    print key, value

अजगर ३

for key, value in data.items():
    print(key, value)

36

स्लाइस संकेतन के लिए टाइपर्रर str[a:b]

tl; डॉ: एक का उपयोग पेट के : एक के बजाय अल्पविराम दो सूचकांक के बीच में aऔर bमेंstr[a:b]


स्ट्रिंग्स और स्लाइस नोटेशन (एक सामान्य अनुक्रम ऑपरेशन ) के साथ काम करते समय , यह हो सकता है कि एक TypeErrorउठाया जाता है, यह इंगित करते हुए कि सूचक पूर्णांक होने चाहिए, भले ही वे स्पष्ट रूप से हों।

उदाहरण

>>> my_string = "hello world"
>>> my_string[0,5]
TypeError: string indices must be integers

हमने स्पष्ट रूप से स्लाइस अंकन के सूचकांकों के लिए दो पूर्णांक पारित किए हैं, है ना? तो यहाँ समस्या क्या है?

यह त्रुटि बहुत निराशाजनक हो सकती है - विशेष रूप से पायथन सीखने की शुरुआत में - क्योंकि त्रुटि संदेश थोड़ा भ्रामक है।

व्याख्या

जब हमने कॉल किया तो हमने दो पूर्णांकों (0 और 5) के एक टुकडे को स्लाइस अंकन के लिए उत्तीर्ण कर दिया my_string[0,5]क्योंकि हम 0,5(यहां तक ​​कि कोष्ठक के बिना भी) एक ही ट्यूपल का मूल्यांकन (0,5)करते हैं।

एक अल्पविराम ,वास्तव में एक अजगर के रूप में कुछ का मूल्यांकन करने के लिए पर्याप्त है:

>>> my_variable = 0,
>>> type(my_variable)
<class 'tuple'>

तो हमने वहां क्या किया, इस बार स्पष्ट रूप से:

>>> my_string = "hello world"
>>> my_tuple = 0, 5
>>> my_string[my_tuple]
TypeError: string indices must be integers

अब, कम से कम, त्रुटि संदेश समझ में आता है।

उपाय

हमें दो पूर्णांकों को सही ढंग से अलग करने के लिए अल्पविराम , को एक बृहदान्त्र के साथ बदलने की आवश्यकता :है:

>>> my_string = "hello world"
>>> my_string[0:5]
'hello'

एक स्पष्ट और अधिक उपयोगी त्रुटि संदेश कुछ इस तरह हो सकता है:

TypeError: string indices must be integers (not tuple)

एक अच्छा त्रुटि संदेश उपयोगकर्ता को सीधे दिखाता है कि उन्होंने क्या गलत किया है और यह अधिक स्पष्ट होगा कि समस्या को कैसे हल किया जाए।

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

सीख सीखी

  • टुकड़ा संकेतन :अपने सूचकांकों को अलग करने के लिए कॉलोन का उपयोग करता है (और चरण श्रेणी, उदा str[from:to:step])
  • टुपल्स को अल्पविराम ,(जैसे t = 1,) द्वारा परिभाषित किया गया है
  • उपयोगकर्ताओं के लिए त्रुटि संदेशों में कुछ जानकारी जोड़ें ताकि यह समझ सकें कि क्या गलत हुआ

चीयर्स और खुश प्रोग्रामिंग
विंकलेर्र


[मुझे पता है कि इस सवाल का जवाब पहले ही दिया जा चुका था और यह बिल्कुल सवाल नहीं था, जो थ्रेड स्टार्टर ने पूछा था, लेकिन मैं यहाँ उपरोक्त समस्या के कारण आया था जो उसी त्रुटि संदेश की ओर ले जाती है। कम से कम मुझे उस छोटे टाइपो को खोजने में काफी समय लगा।

इसलिए मुझे उम्मीद है कि यह किसी और को मदद करेगा जो एक ही त्रुटि पर ठोकर खाई है और उन्हें उस छोटी सी गलती का पता लगाने में कुछ समय बचाता है।]


0

यह तब हो सकता है जब एक अल्पविराम गायब है। मैं इसमें भाग गया जब मेरे पास दो-टुपल्स की सूची थी, जिनमें से प्रत्येक में पहली स्थिति में एक स्ट्रिंग और दूसरी में एक सूची शामिल थी। मैंने गलती से एक मामले में टपल के पहले घटक के बाद अल्पविराम को छोड़ दिया था, और दुभाषिया ने सोचा कि मैं पहले घटक को अनुक्रमित करने की कोशिश कर रहा हूं।


0

मेरे पास पंडों के साथ एक समान मुद्दा था, आपको पुनरावृत्तियों का उपयोग करने की आवश्यकता है () फ़ंक्शन को पुनरावृत्तियों के माध्यम से पांडास डेटासेट पंडों के माध्यम से पुनरावृति करने के लिए

data = pd.read_csv('foo.csv')
for index,item in data.iterrows():
    print('{} {}'.format(item["gravatar_id"], item["position"]))

ध्यान दें कि आपको उस डेटासेट में इंडेक्स को हैंडल करना है जो फ़ंक्शन द्वारा भी लौटाया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.