python - Python-yaml:yaml.reader.ReaderError:不可接受的字符
问题描述
我正在使用 invoice2data 库进行发票解析。这个库在 YAML 中有预定义的模板,用于解析发票。但是当我运行示例时,它给了我所有模板的 YAML 解析错误
将其运行为:
invoice2data --input-reader tesseract FlipkartInvoice.pdf
例外:
Traceback (most recent call last):
File "/home/webwerks/.local/bin/invoice2data", line 10, in <module>
sys.exit(main())
File "/home/webwerks/.local/lib/python3.5/site-packages/invoice2data/main.py", line 191, in main
templates += read_templates()
File "/home/webwerks/.local/lib/python3.5/site-packages/invoice2data/extract/loader.py", line 88, in read_templates
tpl = ordered_load(template_file.read())
File "/home/webwerks/.local/lib/python3.5/site-packages/invoice2data/extract/loader.py", line 36, in ordered_load
return yaml.load(stream, OrderedLoader)
File "/usr/local/lib/python3.5/dist-packages/yaml/__init__.py", line 112, in load
loader = Loader(stream)
File "/usr/local/lib/python3.5/dist-packages/yaml/loader.py", line 44, in __init__
Reader.__init__(self, stream)
File "/usr/local/lib/python3.5/dist-packages/yaml/reader.py", line 74, in __init__
self.check_printable(stream)
File "/usr/local/lib/python3.5/dist-packages/yaml/reader.py", line 144, in check_printable
'unicode', "special characters are not allowed")
yaml.reader.ReaderError: unacceptable character #x0082: special characters are not allowed
in "<unicode string>", position 312
最后一行说:
File "/usr/local/lib/python3.5/dist-packages/yaml/reader.py", line 144, in check_printable
'unicode', "special characters are not allowed")
yaml.reader.ReaderError: unacceptable character #x0082: special characters are not allowed
in "<unicode string>", position 312
我已经检查了模板。所有都在 UTF-8 格式中有效。
问题似乎与python-yaml包有关。有人遇到过这个问题吗?
解决方案
您的输入是有效的 UTF-8 是无关紧要的,因为 YAML 源应该只接受 Unicode 代码点的子集(独立于 UTF-8 或其他一些编码)。
特别是它只支持 Unicode 的可打印子集和旧的 YAML 1.1 规范,PyYAML 支持的规范,详细说明了这一点:
允许的字符范围明确排除代理块#xD800-#xDFFF、DEL #x7F、C0 控制块#x0-#x1F(#x9、#xA 和#xD 除外)、C1 控制块#x80-# x9F、#xFFFE 和 #xFFFF。任何此类字符都必须使用转义序列来表示。
因此,不可打印的“BREAK PERMITTED HERE”代码点0x0082
显然是不允许的(这不是 PyYAML 应该允许但不允许的事情之一)。
推荐阅读
- tensorflow - 关键点检测实现
- javascript - 有没有办法从 Gatsby 的构建失败中获取更多信息?
- node.js - 有没有办法让服务器端渲染反应应用程序?
- express - 如何在expressjs中使用passport-local.Strategy和crypto更改密码?
- python - 使用 Beautifulsoup 抓取体育数据
- pandas - 熊猫列名是整数的键错误
- amazon-web-services - 如何在 .net 应用程序的 aws Lightsail Windows 服务器上安装 SSL
- c++ - 如何从 X11 窗口句柄创建 gtk 窗口句柄
- r - 如何更改 ggplot2 dotplot 上的网格线间距?
- flutter - 在 null 上调用了方法“*”。接收方:null 尝试调用:*(2)