python:csv.reader&;unicode(和postgres)

python:csv.reader&;unicode(和postgres),python,postgresql,Python,Postgresql,我有一个带有unicode字符(西班牙语字符)的CSV。正在尝试将其导入utf8编码的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,

我有一个带有unicode字符(西班牙语字符)的CSV。正在尝试将其导入utf8编码的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)
产生
错误:编码“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”编解码器无法解码位置21-24的字节:无效数据

有没有办法解决这个问题

更新文件不是UTF-8;那是Windows-1252。将“值”列表的赋值更改为:

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

解决了这个问题

您知道CSV文件是用UTF-8编码的吗?如果是的话,你会看到这样的情况:

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

如果它没有显示UTF-8,那么您可能必须使用不同的编解码器对其进行解码,例如ISO-8859-1。

原始文件的编码是什么?要创建
unicode
对象,您需要了解这一点。您正在尝试使用UTF-8进行解码,但这显然是错误的。ARGH。它实际上是windows-1252,尽管文件命令显示ASCII。有没有办法通过iconv或其他方式正确打开该文件?