我在使用Python 2.7,psycopg2和Postgres的Windows 8环境中。
Postgres数据库具有以下编码:
Encoding UTF8
Collation English_United States.1252
Character Type English_United States.1252
Tablespace pg_default
我已将记录插入此数据库,该记录具有基于国家/地区名称的文件名,值如:
cuba.png
curaçao.png
cyprus.png
czech_republic.png
côte_d'ivoire.png
democratic_republic_of_congo.png
我的文件夹中有相应名称的文件:
cuba.png
curaçao.png
cyprus.png
czech_republic.png
côte_d'ivoire.png
democratic_republic_of_congo.png
我使用此代码循环遍历文件,然后使用UPDATE将文件详细信息写回数据库,并使用WHERE子句将数据库记录文件名与实际文件名进行比较。
import os, os.path
from PIL import Image
import psycopg2
conn_string = \
"host='localhost' \
dbname='dbname' \
user='username' \
password='password'"
conn = psycopg2.connect(conn_string)
cur = conn.cursor()
print conn.encoding
screenshots_path = 'C:/path/to/screenshots/'
screenshots_dir = os.listdir(screenshots_path)
for file in screenshots_dir:
if file != 'Thumbs.db':
img = Image.open(screenshots_path + file)
img256 = img.convert('P', palette=Image.ADAPTIVE, colors=5)
colors = img256.getcolors()
color_str = ','.join(str(v) for v in colors)
cur.execute("UPDATE screenshots \
set color_palette = %s \
WHERE filename like %s", \
(color_str, '%' + 'screenshots/' + file + '%',))
conn.commit()
cur.close()
conn.close()
然而,当它到达curaçao(或任何其他有口音的国家等)时会出现以下错误,
Traceback (most recent call last):
File "get_color.py", line 39, in <module>
cur.execute("UPDATE screenshots set color_palette = %s WHERE filename like %
s", (color_str, '%' + 'screenshots/' + file + '%',))
psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0xe7 0x61 0x6f
检索和打印的实际文件名是:
curaτao.png
系统编码:
import sys
print sys.getdefaultencoding()
returns ascii
确认数据库编码:
print conn.encoding
returns UTF8
我认为我需要将文件名与数据库文件名相同的格式/编码,以便可以比较两个字符串。
我正在努力研究如何获得等效性,以便可以使用WHERE子句。
我已经搜索过其他几十个SO问题和网页,我不清楚需要做什么。
我已尝试重置默认编码
import sys
reload(sys)
sys.setdefaultencoding('Cp1252') (with 'latin1', Cp1252, etc)
我将数据从数据库中删除为csv,然后使用UTF-8编码和重新导入的csv数据重新创建数据库。
在使用.encode('utf-8')之前,我试图将u'附加到文件名。
我错过了什么?