TypeError: अनुक्रम आइटम 0: अपेक्षित स्ट्रिंग, int पाया गया


188

मैं एक शब्दकोश से डेटा को डेटाबेस में सम्मिलित करने का प्रयास कर रहा हूं। मैं डेटा प्रकार के आधार पर मूल्यों पर पुनरावृति करना चाहता हूं और उनके अनुसार प्रारूपित करना चाहता हूं। यहां उस कोड का एक स्निपेट दिया गया है जिसका मैं उपयोग कर रहा हूं:

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 डेटा का एक उदाहरण है:

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] 

मैं क्या गलत कर रहा हूं?


42
आपके लिए values = ",".join(map(str, value_list))
आत्मा

जवाबों:


381

string.join तत्वों की सूची के अंदर तत्वों को जोड़ता है, न कि इन्टस।

इसके बजाय इस जनरेटर अभिव्यक्ति का उपयोग करें:

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

32
का उपयोग भी कर सकते हैं.join(map(str, value_list))
बॉलपॉइंटबैन

44

हालाँकि दी गई सूची समझ / जनरेटर अभिव्यक्ति के उत्तर ठीक हैं, मुझे यह पढ़ने और समझने में आसान लगता है:

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

2
मानचित्र और str के इस उपयोग से प्यार करें। मैं आगे जा रहे इस पैटर्न का उपयोग करूंगा :)
टिमोथी सी। क्विन

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

Cval और प्रियांक पटेल के जवाब बड़े काम आते हैं। हालांकि, ध्यान रखें कि कुछ मान यूनिकोड स्ट्रिंग्स हो सकते हैं और इसलिए त्रुटि 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
यह यहाँ सबसे अच्छा समाधान है! मान = ';'
मेल

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