【发布时间】:2014-03-07 19:48:26
【问题描述】:
我正在尝试使用 Python 创建一个从 MySQL 到 Redshift 的简单表复制器。我这样做的方式是在 MySQL 中查询表并使用 Python (2.7) 将输出写入 CSV,然后将它们发送到 S3 并将它们复制到各自的目标表中。
我遇到了 Unicode 字符的问题。具体来说,我收到以下错误:
String contains invalid or unsupported UTF8 codepoints. Bad UTF8 hex sequence: e9 20 50 (error 4)
我的问题是这是 python 问题,还是 S3/Redshift 问题。这是我在 python 中所做的:
import unicodecsv as csv
csv_writer = csv.writer(dest, encoding='utf-8')
for index,line in enumerate(a):
if index == len(a)/2:
file_ext+=1
if dest: dest.close()
dest = open(config['data_dir'] + directory + '/' + table_name + '.txt.' + str(file_ext), 'wb')
csv_writer = csv.writer(dest, encoding='utf-8')
csv_writer.writerow(line)
所以据我了解,Python 正在正确地编写内容。事实上,如果我在 VI 中打开 CSV,我可以看到:
"Fjällräven Canvas Black Kanken 15\ Laptop Bag"""
所以这对我来说是正确的(\ 和额外的“是来自源的垃圾)。但是,如果我对 csv 运行文件,我会得到:ASCII text, with very long lines, with CRLF line terminators。在将文件移动到 S3 并运行副本后,我结束了出现上述 Redshift COPY 错误。
所以,回到问题:我怀疑这与 file 的编码方式有关,而不是其中的内容,但我无法找到通过我的搜索得到任何确定的信息。有没有人遇到过这个问题,他们找到了解决方案吗?感谢您的帮助
【问题讨论】:
-
我的猜测是
line是一个str数据对象,其中包含(当然是非 unicode)非 utf-8 编码的编码文本,当您尝试将其写入您的csv_writer它无法将该数据从 utf-8 解码为 unicode,因为它不是 utf-8。您应该找出line的编码,并且应该使用它而不是'utf-8' 作为编码参数。如果您使用的是 Windows,那么它可能是“windows-12XX”编码之一,具体取决于您的语言环境。 -
你拼错了 Kånken (-:
标签: python utf-8 amazon-redshift