CSV模块" UnicodeEncodeError"使用Dictwriter.writerows时

时间:2017-01-24 21:41:34

标签: python macos postgresql

我在应该镜像我的开发环境的新Mac服务器上设置prod环境。这个工作在我的开发计算机上顺利运行,但在服务器上我得到了这个回溯:

Traceback (most recent call last):
  File "/usr/local/share/Code/PycharmProjects/etl3/jira_scripts/jira_issues_incremental.py", line 189, in <module>
    writer.writerows(rows)
  File "/usr/local/bin/anaconda3/envs/etl3/lib/python3.5/csv.py", line 156, in writerows
    return self.writer.writerows(map(self._dict_to_list, rowdicts))
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 1195: ordinal not in range(128)

此作业正在Run Shell Script应用中的Automator终端上运行。我已经检查了sys.defaultencoding()终端中的Automater以及机器本身。一切都说utf8。我还检查了PostgreSQL数据库中的编码,并且还设置为UTF8。以下是open正在写入的文件的Dictwriter语句:

    with open(loadfile, 'w') as outf:
        writer = csv.DictWriter(
            f=outf,
            delimiter='|',
            fieldnames=fieldnames,
            extrasaction='ignore',
            escapechar=r'/',
            quoting=csv.QUOTE_MINIMAL
        )
        writer.writerows(rows)

由于所有默认编码似乎都是正确的,我甚至不知道在哪里开始追踪此错误...我应该提到这个文件然后被复制到PostgreSQL数据库之后使用psycopg2.cursor.copy_from命令,因此文件应该以与之兼容的模式写入。

1 个答案:

答案 0 :(得分:2)

您没有为文件指定编码,因此默认编解码器用于您的系统。目前是ASCII。请参阅open() documentation

  

在文本模式下,如果未指定 encoding ,则使用的编码取决于平台:调用locale.getpreferredencoding(False)以获取当前的语言环境编码。

请指定其他编解码器。 UTF-8可以工作:

with open(loadfile, 'w', encoding='utf8') as outf:

sys.getdefaultencoding()不适用于此处;这仅仅是非限定str.encode()来电的默认值。