csv Jinja2 模板呈现 unicode 错误

csv Jinja2 template render unicode error

我正在尝试使用 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 字符 ¦ 但我不知道在哪里,虽然我已经搜索了模板和 dictReader。我已阅读文档 (http://jinja.pocoo.org/docs/dev/api/#unicode),但不明白如何减轻此错误。

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

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

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

或者您可以从模板文件中删除花哨的破折号。

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