python excel:汉字的数据类型问题

python excel:汉字的数据类型问题,python,Python,这是我在这个论坛上的第一个问题。我是python的初学者 问题:我正在尝试从表中检索DB2(IBM I)数据并写入excel工作表(.xls)。为了得到数据,我使用pyodbc并将其写入excel,使用xlwt模块。 Col4具有中文字符。我知道col4 CCSID是935,pyodbc按原样从DB中检索数据,但当我将此值写入excel工作表时,它会抛出以下错误消息。下面是dset1中的数据(如果我打印)。如何在没有任何问题的情况下将其写入excel 0(十进制('6331840'),'RUBO

这是我在这个论坛上的第一个问题。我是python的初学者

问题:我正在尝试从表中检索DB2(IBM I)数据并写入excel工作表(.xls)。为了得到数据,我使用pyodbc并将其写入excel,使用xlwt模块。 Col4具有中文字符。我知道col4 CCSID是935,pyodbc按原样从DB中检索数据,但当我将此值写入excel工作表时,它会抛出以下错误消息。下面是dset1中的数据(如果我打印)。如何在没有任何问题的情况下将其写入excel

0(十进制('6331840'),'RUBO','587','\x0e\xa3\x1a\x1a\x1a\x1a',十进制('175'),十进制('3716')) 1(十进制('6331841'),'RUBO','587','\x0e\xa3\x1a\x1a\x1a\x1a',十进制('24'),十进制('340')) 2(十进制('6331842'),'RUBO','587','\x0e\xa3\x1a\x1a\x1a\x1a',十进制('100'),十进制('1821'))

参考:

  • 第二种方法是在工作簿初始化期间使用xlwt解码此值,如下所示

    book=xlwt.工作簿(encoding=“gb2312”)

  • 参考:


    谢谢大家在这方面给了我一些指导

    您能从问题中消除Excel或ODBC吗?我的猜测是,问题是基于编码的,但很难判断哪部分有问题,只是它们不匹配。另外,“意外数据类型”的类型是什么?您是否能够更改字符的编码?CCSID 935不是标准Python库()所涵盖的编码之一,因此您必须为其找到或编写自定义编解码器。最终,
    xlwt
    需要输入Unicode对象或按声明编码的bytestring(它将使用Python的标准选择对其进行解码),因此在写入之前,您的基本路径应该是将bytestring中的col4值解码到Unicode对象中,
    dset
    将是一个行列表,其中每一行都是一个类似元组的对象。您不能直接使用xlwt编写它们,这可能就是您遇到异常的原因。您需要一个嵌套for循环-
    for rownum,row in enumerate(dset1):for colnum,val in enumerate(row):sh.write(rownum,colnum,val)
    。这与编码困难无关(这将是一个真正的问题),但仍然很重要。嵌套for循环中的另一个修改-
    rownum
    需要从1开始,而不是从0开始,因为您要将标题写入第0行
    sh.write(rownum+1
    可以这样做,或者直接跟踪它并在每个for循环中递增,就像您试图使用
    n
    @Ulrich Eckhardt所做的那样,意外的数据类型字符串及其CCSID在DB2中为935
    File "C:\Python27\Tools\john\EOD_CMR report.py", line 82, in <module>
        sh.write(n, i, val)
      File "C:\Python27\lib\site-packages\xlwt\Worksheet.py", line 1030, in write
        self.row(r).write(c, label, style)
      File "C:\Python27\lib\site-packages\xlwt\Row.py", line 259, in write
        raise Exception("Unexpected data type %r" % type(label))
    Exception: Unexpected data type <type 'pyodbc.Row'>
    
    
    import pyodbc
    import os
    import sys, traceback
    import xlwt
    
    #initiate excel
    book = xlwt.Workbook()
    sh = book.add_sheet('sheet1')
    #get today date YYYYMMDD
    now = datetime.datetime.now() # get today's date
    today = str(now.year) + str(now.month).zfill(2) + str(now.day).zfill(2)
    #SQL statement
    sql1 = """SELECT col1, col2, col3, trim(col4)FROM lib.file WHERE date = %s""" % today
    
    con_string = "Driver={iSeries Access ODBC Driver};System=veet;Database=veet;UID=" + user_id + ";pwd=" + password + ";SSL=YES;unicode_results=True"
    
    cnxn = pyodbc.connect(con_string)
    cur = cnxn.cursor()
    # get the data
    dset1 = cur.execute(sql1).fetchall()
    cur.close()
    
    # to write column name
    x = ['Packlist', 'Carrier', 'Hub', 'City', 'Carton amount', 'DU']
    n = 0
    for i, hdr in enumerate(x):
            sh.write(n,i,hdr)
    for i, val in enumerate(dset1):
            n+=1
            sh.write(n, i, val)
    name = today + 'xls'
    book.save(name)
    
    con_string = "Driver={iSeries Access ODBC Driver};System=veet;Database=veet;UID=" + user_id + ";pwd=" + password + ";SSL=YES;unicode_results=True;CCSID=1386"