python - 使用 UnicodeWriter 时可怕的 "ordinal not in range"——否则文件会干净地写入/读取

标签 python python-2.7 csv unicode

我正在尝试使用 UnicodeWriter example在 Python 2.7 的 csv writer 库文档的底部给出,但我得到了臭名昭著的信息: UnicodeEncodeError: 'ascii' codec can't Encode character u'\xb7' inposition 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?我做错了什么?

*我犹豫在这里使用字符串这个词,因为我认为它在 Python 2.7 中有特定的含义(我不太理解)。我的意思是一般意义上的。

附注如果重要的话,我的 NLS_LANG 环境变量设置为 .US7ASCII。另外,请原谅我的无知——我是在 Python 中使用 Unicode 和字符编码/解码的新手。

最佳答案

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

您可以正常打开该文件。 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)

关于python - 使用 UnicodeWriter 时可怕的 "ordinal not in range"——否则文件会干净地写入/读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448504/

相关文章:

python - 如何为Python 2.7重新安装GDAL库?

python - 在 PsychoPy 中定义楼梯的正确答案

python - 编写字典列表,每个键有多个值作为新行

c - C 中的 UTF-16 到 UTF-8

python - 如何更改 seaborn 图中的轴刻度数

python - gae-sessions 和 nose 的错误

python - 从 Stanford Parser 的上下文无关短语结构输出中提取信息

python - 如何在for循环中合并DataFrame?

python - 从嵌套列表的字典理解返回字典

PHP fputcsv 生成空文件