2011-02-28 46 views
-1

我有一個帶有unicode字符(西班牙文和ntilde;字符)的CSV。試圖將其導入到utf8編碼的psotgres表中被證明是謀殺。下面的代碼:python:csv.reader&unicode(和postgres)

reader = csv.reader(open(filename, 'r'), delimiter=',') 

for row in reader: 
    values = [None if x == '' else x for x in row] 
    query = 'INSERT INTO %s.rosters VALUES(%s)' % (self.schema, ','.join(['%s'] * len(values))) 
    self.executequery(query, values) 

息率ERROR: invalid byte sequence for encoding "UTF8": 0xf1616461。因此,將其更改爲:

reader = csv.reader(open(filename, 'r'), delimiter=',') 

for row in reader: 
    values = [None if x == '' else unicode(x, 'utf-8') for x in row] 
    query = 'INSERT INTO %s.rosters VALUES(%s)' % (self.schema, ','.join(['%s'] * len(values))) 
    self.executequery(query, values) 

息率'utf8' codec can't decode bytes in position 21-24: invalid data

有什麼辦法解決呢?

更新該文件不是UTF-8;它是Windows-1252。將值列表的賦值更改爲:

values = [None if x == '' else unicode(x, 'cp1252') for x in row] 

解決了問題!

+0

原始文件的編碼是什麼?你需要知道這個才能創建'unicode'對象。您正在嘗試使用UTF-8進行解碼,但這顯然不正確。 – AdmiralNemo 2011-02-28 23:42:39

回答

1

你知道CSV文件是用UTF-8編碼的嗎?如果是,你會看到這樣的事情:

$ file foo.txt 
foo.txt: UTF-8 Unicode text 

如果不說UTF-8,那麼你很可能將其與不同的編解碼器,如ISO-8859-1解碼。

+0

ARGH。它實際上是windows-1252,即使文件命令說ASCII。有什麼方法可以通過iconv或其他方式正確打開該文件嗎? – Wells 2011-03-01 00:20:38