使用UnicodeWriter时可怕的“序号不在范围内” - 否则文件写入/读取干净

时间:2014-12-12 17:01:21

标签: python python-2.7 csv unicode

我正在尝试使用Python 2.7文档底部给出的UnicodeWriter example来获取csv编写器库,但是一旦我将数据传递给我,我就会收到臭名昭着的UnicodeEncodeError: 'ascii' codec can't encode character u'\xb7' in position 53: ordinal not in range(128)错误UnicodeWriter的writerow()包含变音符号。

我可以将数据写入文件而不会出现错误,如下所示:

ff = codecs.open(conf.settings.CSV_OUTPUT_DIR + '/' + filename, mode='w', encoding='utf-8')
ff.write(r)

其中r是来自Oracle数据库结果的游标中行的索引。当我查看生成的文件时,变音符号和其他非ASCII字符显示就好了。但是,当我切换到使用UnicodeWriter时:

ff = codecs.open(conf.settings.CSV_OUTPUT_DIR + '/' + filename, mode='w', encoding='utf-8')
writer = UnicodeWriter(ff)
writer.writerow(row)

(其中row只是一个列表,我连接了所有字符串*我从该游标中检索到的特定行)它失败并显示我上面复制的错误消息。为什么我可以使用write()将数据写入磁盘(并且读得很好),但我不能使用UnicodeWriter?我做错了什么?

*我在这里使用单词string犹豫不决,因为我认为它在Python 2.7中具有特定含义(我不太了解)。我的意思是一般意义上的。

P.S。如果重要,我的NLS_LANG envvar设置为.US7ASCII。另外,请原谅我的任何无知 - 我是新手,在Python中使用Unicode和字符编码/解码。

1 个答案:

答案 0 :(得分:1)

在您的第二个示例中,UnicodeWriter处理编码。换句话说,你不需要用codecs打开文件,事实上这就是导致异常的原因。

相反,您可以正常打开文件。 UnicodeWriter类默认编码为UTF-8。所以你的代码看起来应该更像:

import os # for os.path.join(): a cross-platform solution to combining path elements
with open(os.path.join(conf.settings.CSV_OUTPUT_DIR, filename), 'wb') as fou:
    writer = UnicodeWriter(fou)
    writer.writerow(row)