আমি কেন "টাইপএররার: স্ট্রিং সূচকগুলি অবশ্যই পূর্ণসংখ্যা" দেখতে পাচ্ছি?


219

আমি অজগর দুটি শেখার সাথে খেলছি এবং গিথুব বিষয়গুলি একটি পঠনযোগ্য ফর্মে আনার চেষ্টা করছি। পরামর্শ ব্যবহার আমি কিভাবে CSV তে তাদেরকে JSON রূপান্তর করতে পারেন? আমি এটি নিয়ে এসেছি:

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"]])

যেখানে "ইস্যু.জসন" হ'ল আমার গিথুব সমস্যাগুলি সম্বলিত জাসন ফাইল। আমি যখন এটি চালানোর চেষ্টা করি তখন আমি পাই

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বস্তু। সুতরাং, এটির মতো পুনরাবৃত্তি করুন:

পাইথন 2

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

পাইথন ঘ

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

36

স্লাইস নোটেশনের জন্য টাইপ এরিয়ার str[a:b]

tl; dr: দুটি সূচক এবং এর মধ্যে কমা পরিবর্তে কোলন ব্যবহার করুন:abstr[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"]))

নোট করুন যে আপনার ডেটাসেটে সূচকটি পরিচালনা করতে হবে যা ফাংশন দ্বারা ফিরে আসে returned

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.