TypeError: chuỗi mục 0: chuỗi dự kiến, int được tìm thấy


186

Tôi đang cố gắng chèn dữ liệu từ mộ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. Đây là một đoạn mã tôi đang sử dụng:

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 thuật toán bằng cách sử dụng một số dữ liệu mẫu (xem bên dưới), tôi gặp lỗi:

TypeError: chuỗi mục 0: chuỗi dự kiến, int được tìm thấy

Một ví dụ về dữ liệu value_list đưa ra 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?


41
values = ",".join(map(str, value_list))
linh hồn

Câu trả lời:


380

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

Sử dụng biểu thức trình tạo này thay thế:

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

31
Cũng có thể sử dụng.join(map(str, value_list))
BallpointBen

44

Mặc dù các câu trả lời hiểu / biểu thức trình tạo danh sách đã cho là ổn, tôi thấy điều này dễ đọc và dễ hiểu hơn:

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

2
Yêu việc sử dụng bản đồ và str. Tôi sẽ sử dụng mô hình này trong tương lai :)
Timothy C. Quinn

17

Thay thế

values = ",".join(value_list)

với

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

HOẶC LÀ

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

1
Một số khác values = ','.join(str(value_list)[1:-1])
Priyank Patel

4
loại bỏ [, ]từ ví dụ thứ hai của bạn, không cần phải hiểu danh sách và bằng cách loại bỏ chúng, bạn có một trình tạo hiệu quả hơn.
jamylak

3
Trên thực tế, như đã giải thích tại stackoverflow.com/questions/9060653/ , sử dụng một danh sách thay vì trình tạo trong str.join()phương thức nhanh hơn ...
dtheodor

12

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

Ví dụ: giả sử chuỗi Libië (tiếng Hà Lan cho Libya), được biểu thị bằng Python là chuỗi unicode u'Libi\xeb':

print str(u'Libi\xeb')

ném 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)

Tuy nhiên, dòng sau đây sẽ không gây ra lỗi:

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

Vì vậ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! value = ','. tham gia ([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 các ký tự ascii mở rộng.
mel

Không còn là vấn đề trong Python3, str('\xeb')=>ë
Brayoni

0

Nội suy chuỗi là một cách hay để truyền trong một chuỗi được định dạng.

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


0

trước tiên bạn có thể chuyển đổi khung dữ liệu số nguyên thành chuỗi và sau đó thực hiện thao tác, vd

df3['nID']=df3['nID'].astype(str)
grp = df3.groupby('userID')['nID'].aggregate(lambda x: '->'.join(tuple(x)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.