2012-06-04 22 views
84

Tôi đang cố chèn dữ liệu từ từ điển vào cơ sở dữ liệu. Tôi muốn lặp lại các giá trị và định dạng chúng cho phù hợp, tùy thuộc vào loại dữ liệu. Dưới đây là một đoạn mã tôi đang sử dụng:LoạiError: mục chuỗi 0: chuỗi được mong đợi, int được tìm thấy

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 

Khi tôi chạy algo sử dụng một số dữ liệu mẫu (xem dưới đây), tôi nhận được lỗi:

TypeError: sequence item 0: expected string, int found

Một ví dụ về dữ liệu VALUE_LIST cung cấp lỗi ở trên là:

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] 

Tôi đang làm gì sai?

+19

soulution cho bạn:. Giá trị '= "" tham gia (bản đồ (str, VALUE_LIST)) ' – ddzialak

Trả lời

200

string.join kết nối các phần tử bên trong danh sách chuỗi chứ không phải int.

Sử dụng biểu hiện máy phát điện này để thay thế:

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

Thay

values = ",".join(value_list) 

với

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

HOẶC

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

Tham số khác' value = ','. (Str (value_list) [1: -1]) ' –

+3

xóa' [','] 'khỏi ví dụ thứ hai của bạn, không cần phải hiểu danh sách và xóa họ bạn có một máy phát điện đó là hiệu quả hơn. – jamylak

+0

Thực ra, như được giải thích tại http: // stackoverflow.com/questions/9060653/list-comprehension-without-python, sử dụng danh sách thay vì máy phát trong phương thức 'str.join()' nhanh hơn ... – dtheodor

10

Câu trả lời của cvalPriyank Patel hoạt động tốt. Tuy nhiên, lưu ý rằng một số giá trị có thể là các chuỗi unicode và do đó có thể gây ra lỗi str để gửi một lỗi UnicodeEncodeError. Trong trường hợp đó, hãy thay thế hàm str bằng hàm unicode.

Ví dụ, giả sử chuỗi Libië (Hà Lan cho Libya), đại diện trong Python như chuỗi unicode u'Libi\xeb':

print str(u'Libi\xeb') 

ném các lỗi sau:

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) 

Các dòng sau, tuy nhiên , sẽ không ném một lỗi:

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

Vì vậy, hãy thay thế :

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

bởi

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

để được an toàn.

+1

Đây là giải pháp tốt nhất ở đây! values ​​= ','. join ([unicode (i) cho i trong value_list]) hoạt động trong trường hợp bạn có kết hợp các số nguyên và chuỗi với ký tự ascii mở rộng. – mel

8

Mặc dù danh sách đưa ra biểu hiện sự hiểu biết/máy phát điện câu trả lời là ok, tôi tìm thấy dễ dàng hơn này để đọc và hiểu:

values = ','.join(map(str, value_list)) 
Các vấn đề liên quan