python
  • csv
  • encoding
  • pyodbc
  • 2013-06-18 1 views 2 likes 
    2

    파이썬에서 utf-8 csv 파일을 내보내는 동안 오류가 발생했습니다. 이 오류는 내가 Access 데이터베이스를 연결하고이 데이터를 얻을 수 pyodbc를 사용파이썬에서 utf-8 csv 파일을 내 보냅니다.

    AttributeError: 'int' object has no attribute 'encode' 
    

    먼저 말한다.

    MDB = "E:/Research/2000-01.mdb"; DRV = '{Microsoft Access Driver (*.mdb)}'; PWD = 'pw' 
    con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD)) 
    cur = con.cursor() 
    SQL = 'SELECT * FROM 200001;' 
    rows = cur.execute(SQL).fetchall() 
    cur.close() 
    con.close() 
    

    다음 클래스를 사용이

    class UnicodeWriter: 
        """ 
        A CSV writer which will write rows to CSV file "f", 
        which is encoded in the given encoding. 
        """ 
    
    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
        # Redirect output to a queue 
        self.queue = cStringIO.StringIO() 
        self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
        self.stream = f 
        self.encoder = codecs.getincrementalencoder(encoding)() 
    
    def writerow(self, row): 
        self.writer.writerow([s.encode("utf-8") for s in row]) 
        # Fetch UTF-8 output from the queue ... 
        data = self.queue.getvalue() 
        data = data.decode("utf-8") 
        # ... and reencode it into the target encoding 
        data = self.encoder.encode(data) 
        # write to the target stream 
        self.stream.write(data) 
        # empty queue 
        self.queue.truncate(0) 
    
    def writerows(self, rows): 
        for row in rows: 
         self.writerow(row) 
    

    내가 UTF-8 CSV 파일을 쓰기 시작

    with open("E:/Research/200001.txt", 'wb') as f: 
        writer = UnicodeWriter(f) 
        writer.writerows(rows) 
    

    행 예시적인 라인은

    (577540, u'1', datetime.datetime(2000, 1, 1, 0, 0), u'85411000', u'53', u'4403944851', u'44039', u'10', u'116', u'110', u'4', u'01', 89956, 0.15575717389583588, u'\u5916\u5546\u72ec\u8d44\u4f01\u4e1a', u'\u5c71\u7279\u7535\u5b50 (\u6df1\u5733) \u6709\u9650\u516c\u53f8', u'\u6df1\u5733\u5b9d\u5b8972\u533a\u5b9d\u77f3\u8def\u53f7', u'755 27757943', u'', u'518101', u'', u'\u90d1\u66fc\u5a1c', u'\u4e8c\u6781\u7ba1\uff0c\u4f46\u5149\u654f\u4e8c\u6781\u7ba1\u6216\u53d1\u5149\u4e8c\u6781\u7ba1\u9664\u5916', u'\u5e7f\u4e1c\u7701\u6df1\u5733', u'\u65e5\u672c', u'\u6df1\u5733\u6d77\u5173', u'\u4e00\u822c\u8d38\u6613', u'\u6c7d\u8f66\u8fd0\u8f93', u'\u4e2a/\u5957', u'\u9999\u6e2f', u'\u8fdb\u53e3') 
    

    입니다 그것은 각 줄에 정수가 들어있는 것처럼 보입니다. 그리고 datetime 물건. 이 문제를 해결할 생각은 없습니까? 고마워요!

    답변

    1

    당신은 아마 writer.writerows하기 전에, 먼저이 같은 작업을 수행해야합니다

    rows = [[unicode(x) for x in row] for row in rows]

    또는은, 내 생각 엔 그것은 데이터베이스 행 ID를 작성하려고 밖으로 엿 것입니다. 그래서 당신은 아마를 슬라이스 시도 할 수 :

    rows = [row[1:] for row in rows]

    +0

    첫 번째 제안은 바로이며 작동합니다. 감사! – user2371220

     관련 문제

    • 관련 문제 없음^_^