python: csv.reader 与 Unicode(及 Postgres)

-1 投票
1 回答
885 浏览
提问于 2025-04-16 12:42

我有一个CSV文件,其中包含一个Unicode字符(西班牙语的ñ字符)。我想把这个文件导入到一个使用UTF-8编码的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]

就解决了这个问题!

1 个回答

1

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

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

如果没有显示UTF-8,那你可能需要用其他编码方式来解码,比如ISO-8859-1。

撰写回答