csv Jinja2模板呈现unicode错误

时间:2015-02-18 16:40:44

标签: python csv unicode jinja2

我正在尝试使用csv文件中的变量渲染jinja2模板:

# -*- coding: utf-8 -*-

import csv
from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('baseconfig.j2')

with open('C:\Users\\robertph\CompanyA.csv', mode='r') as csvfile:
    dictReader = csv.DictReader(csvfile)
    for row in dictReader:
        hostname = row['hostname'] + '.txt'
        with open('C:\Users\\robertph\host_vars\\' + hostname,'w') as fh:
            fh.write(template.render(row))

但是我收到以下错误:

File ".\csv2dict_test2.py", line 18, in <module>
    fh.write(template.render(row))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 2042: ordinal not in range(128)

我想我理解的错误是我在某个地方有一个unicode字符¦,但我不知道在哪里,虽然我已经搜索了模板和&amp; dictReader。我已阅读文档(http://jinja.pocoo.org/docs/dev/api/#unicode),但不了解如何缓解此错误。

1 个答案:

答案 0 :(得分:5)

此处有问题的字符是U+2013 EN DASH,是您模板的一部分;你的CSV输入都是ASCII字节串(否则Jinja2会抱怨它们)。

您可以对模板结果进行编码:

fh.write(template.render(row).encode('utf8'))

或者您可以从模板文件中删除该花哨的短划线。

Jinja模板始终呈现为Unicode字符串,但Python 2文件对象需要编码字符串。如果你之前没有看到这种情况,那是因为如果不是非ASCII代码点,那么发生的对ASCII的隐式编码会成功,而你的模板现在包括。