我正在尝试使用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),但不了解如何缓解此错误。
答案 0 :(得分:5)
此处有问题的字符是U+2013 EN DASH,是您模板的一部分;你的CSV输入都是ASCII字节串(否则Jinja2会抱怨它们)。
您可以对模板结果进行编码:
fh.write(template.render(row).encode('utf8'))
或者您可以从模板文件中删除该花哨的短划线。
Jinja模板始终呈现为Unicode字符串,但Python 2文件对象需要编码字符串。如果你之前没有看到这种情况,那是因为如果不是非ASCII代码点,那么发生的对ASCII的隐式编码会成功,而你的模板现在包括。