TypeError: ক্রম আইটেম 0: প্রত্যাশিত স্ট্রিং, int পাওয়া গেছে


186

আমি একটি অভিধান থেকে ডেটাবেসে ডেটা toোকানোর চেষ্টা করছি। আমি মানগুলির পুনরাবৃত্তি করতে চাই এবং সেই অনুসারে সেগুলি ফর্ম্যাট করতে চাই, ডাটা টাইপের উপর নির্ভর করে। আমি যে কোডটি ব্যবহার করছি তার একটি স্নিপেট এখানে দেওয়া হয়েছে:

def _db_inserts(dbinfo):
    try:
        rows = dbinfo['datarows']

        for row in rows:
            field_names = ",".join(["'{0}'".format(x) for x in row.keys()])
            value_list = row.values()

            for pos, value in enumerate(value_list):
                if isinstance(value, str):
                    value_list[pos] = "'{0}'".format(value)
                elif isinstance(value, datetime):
                    value_list[pos] = "'{0}'".format(value.strftime('%Y-%m-%d'))

            values = ",".join(value_list)

            sql = "INSERT INTO table_foobar ({0}) VALUES ({1})".format(field_names, values)

    except Exception as e:
        print 'BARFED with msg:',e

যখন আমি কিছু নমুনা ডেটা ব্যবহার করে অ্যালগো চালাই (নীচে দেখুন), আমি ত্রুটি পেয়েছি:

TypeError: ক্রম আইটেম 0: প্রত্যাশিত স্ট্রিং, int পাওয়া গেছে

উপরের ত্রুটিটি প্রদান করে এমন একটি ভ্যালু_লিস্টের ডেটা উদাহরণ:

value_list = [377, -99999, -99999, 'f', -99999, -99999, -99999, 1108.0999999999999, 0, 'f', -99999, 0, 'f', -99999, 'f', -99999, 1108.0999999999999, -99999, 'f', -99999, 'f', -99999, 'f', 'f', 0, 1108.0999999999999, -99999, -99999, 'f', 'f', 'f', -99999, 'f', '1984-04-02', -99999, 'f', -99999, 'f', 1108.0999999999999] 

আমি কি ভুল করছি?


41
আপনার জন্য আত্মঘাতী:values = ",".join(map(str, value_list))
ডিডিজিয়ালাক

উত্তর:


380

string.join ইনট নয় স্ট্রিংয়ের তালিকার অভ্যন্তরে উপাদানগুলিকে সংযুক্ত করে।

পরিবর্তে এই জেনারেটর এক্সপ্রেশন ব্যবহার করুন:

values = ','.join(str(v) for v in value_list)

31
এছাড়াও ব্যবহার করতে পারেন.join(map(str, value_list))
বলপয়েন্টবেন

44

যদিও প্রদত্ত তালিকার বোধগম্যতা / জেনারেটরের এক্সপ্রেশন উত্তরগুলি ঠিক আছে তবে আমি এটি পড়তে এবং বুঝতে সহজ মনে করি:

values = ','.join(map(str, value_list))

2
মানচিত্র এবং স্ট্রিং এর ব্যবহার পছন্দ। আমি এই ধরণটি এগিয়ে যাব :)
তীমথিয় সি। কুইন

17

প্রতিস্থাপন করা

values = ",".join(value_list)

সঙ্গে

values = ','.join([str(i) for i in value_list])

অথবা

values = ','.join(str(value_list)[1:-1])

1
আর একটি values = ','.join(str(value_list)[1:-1])
প্রিয়ঙ্ক প্যাটেল

4
অপসারণ [, ]আপনার দ্বিতীয় উদাহরণ থেকে, একটি তালিকা ধী প্রয়োজন হয় না এবং তাদের সরিয়ে আপনি একটি জেনারেটর যা আরও দক্ষ আছে।
জামিলাক

3
বাস্তবিক, যেমন এ ব্যাখ্যা stackoverflow.com/questions/9060653/... , পরিবর্তে একটি তালিকা ব্যবহার জেনারেটর str.join()পদ্ধতি দ্রুততর ...
dtheodor

12

কোভাল এবং প্রিয়ঙ্ক প্যাটেলের উত্তরগুলি দুর্দান্ত কাজ করে। তবে, সচেতন থাকুন যে কিছু মান ইউনিকোড স্ট্রিং হতে পারে এবং সেই কারণে strএকটি UnicodeEncodeErrorত্রুটি ছুঁড়ে দিতে পারে । সেক্ষেত্রে ফাংশনটি ফাংশন strদ্বারা প্রতিস্থাপন করুন unicode

উদাহরণস্বরূপ, পাইবিলে ইউনিকোড স্ট্রিং হিসাবে উপস্থাপিত লিবিয় (লিবিয়ার ডাচ) স্ট্রিংটি ধরে নিন u'Libi\xeb':

print str(u'Libi\xeb')

নিম্নলিখিত ত্রুটি ছুড়ে:

Traceback (most recent call last):
  File "/Users/tomasz/Python/MA-CIW-Scriptie/RecreateTweets.py", line 21, in <module>
    print str(u'Libi\xeb')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xeb' in position 4: ordinal not in range(128)

নিম্নলিখিত লাইনটি তবে ত্রুটি ছুঁড়ে ফেলবে না:

print unicode(u'Libi\xeb') # prints Libië

সুতরাং, প্রতিস্থাপন করুন:

values = ','.join([str(i) for i in value_list])

দ্বারা

values = ','.join([unicode(i) for i in value_list])

নিরাপদ হতে.


1
এটি এখানে সেরা সমাধান! মানগুলি = ','। যোগ দিন ([ইউনিকোড (i) আমি মান_ তালিকার জন্য i]) যা আপনার যদি বর্ধিত আসকি অক্ষরের সাথে পূর্ণসংখ্যার এবং স্ট্রিংগুলির মিশ্রণ করে তবে কাজ করে।
মেল

পাইথন 3, str('\xeb')=>ë
ব্রায়োনি

0

স্ট্রিং ইন্টারপোলেশন একটি ফর্ম্যাট স্ট্রিংয়ে যাওয়ার একটি দুর্দান্ত উপায়।

values = ', '.join('$%s' % v for v in value_list)


0

আপনি প্রথমে পূর্ণসংখ্যার ডেটাফ্রেমকে স্ট্রিংয়ে রূপান্তর করতে পারেন এবং তারপরে অপারেশন যেমন করতে পারেন

df3['nID']=df3['nID'].astype(str)
grp = df3.groupby('userID')['nID'].aggregate(lambda x: '->'.join(tuple(x)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.