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 隐式编码将会成功。
我正在尝试使用 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 隐式编码将会成功。