2012-08-09 143 views
2

我從python web site複製此腳本:蟒蛇CSV unicode的例子

import sqlite3 
import csv 
import codecs 
import cStringIO 
import sys 

class UTF8Recoder: 
    """ 
    Iterator that reads an encoded stream and reencodes the input to UTF-8 
    """ 
    def __init__(self, f, encoding): 
     self.reader = codecs.getreader(encoding)(f) 

    def __iter__(self): 
     return self 

    def next(self): 
     return self.reader.next().encode("utf-8") 

class UnicodeReader: 
    """ 
    A CSV reader which will iterate over lines in the CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     f = UTF8Recoder(f, encoding) 
     self.reader = csv.reader(f, dialect=dialect, **kwds) 

    def next(self): 
     row = self.reader.next() 
     return [unicode(s, "utf-8") for s in row] 

    def __iter__(self): 
     return self 

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) 

當我運行該腳本,我得到這個錯誤:

Traceback (most recent call last): 
    File "makeCSV.py", line 20, in <module> 
    class UnicodeReader: 
    File "makeCSV.py", line 26, in UnicodeReader 
    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
AttributeError: 'module' object has no attribute 'excel' 

什麼可以原因的錯誤,以及如何能我修復它?

+0

什麼版本的python?我有csv.excel 2.6.1 – 2012-08-09 12:42:40

+0

python 2.7,之前它工作 – torayeff 2012-08-09 12:43:48

+0

hrm,它仍然存在,http://docs.python.org/library/csv.html#csv.excel – 2012-08-09 12:46:07

回答

6

這個模塊,csv,我不認爲這是你的想法。檢查導入的路徑中是否沒有任何csv.py,而不是stdlib csv模塊。

您可以打印出csv.__file__(從腳本中)以查看它來自哪裏。然後,刪除/移動有問題的文件,以便導入stdlib csv。

1

也許問題是愚蠢的,但我認爲它值得回答它,而不是刪除它。我已經在帶有問題腳本的工作目錄上創建了csv.py腳本,因此我首先理解python解釋器嘗試從當前工作目錄中導入庫,然後從python文件路徑導入庫,這是問題所在。

+1

你不喜歡我的回答:( – 2012-08-09 12:57:31