python - Python 语法错误:非 ASCII
问题描述
我不断收到错误,我不确定如何修复它。
代码行:
if not len(lines) or lines[-1] == '' or lines[-1] == '▁':
lines = list(filter(lambda line: False if line == '' or line == '▁' else True, list(lines)))
输出:语法错误:第 512 行的文件 prepare_data.py 中的非 ASCII 字符“\xe2”,但未声明编码;有关详细信息,请参见http://python.org/dev/peps/pep-0263/
解决方案
错误消息会告诉您究竟出了什么问题。Python 解释器需要知道显示为时髦下划线的字符串中字节的编码。
如果你想匹配U+2581那么你可以说
.... or lines[-1] == '\u2581':
它通过 Unicode 转义序列以纯 ASCII 表示此字符。如果你想匹配一个常规的 ASCII 下划线,那就是 ASCII 95 / U+005F;以下是并排的两个字符,以便于比较和可能的复制/粘贴:
U+2581 ▁ _ U+005F
错误消息中链接的 PEP 会准确地告诉您如何告诉 Python“此文件不是纯 ASCII;这是我正在使用的编码”。如果编码是 UTF-8,那就是
# coding=utf-8
或 Emacs 兼容的
# -*- encoding: utf-8 -*-
如果您不知道您的编辑器使用哪种编码来保存此文件,请使用十六进制编辑器和一些谷歌搜索来检查它。Stack Overflow字符编码标签有一个标签信息页面,其中包含更多信息和一些故障排除提示。
总而言之,在 7 位 ASCII 范围 (0x00-0x7F) 之外,Python 不能也不能猜测字节序列代表什么字符串。https://tripleee.github.io/8bit#e2显示了字节 0xE2 的 21 种可能解释,这仅来自传统的 8 位编码;但它也很可能是多字节编码的第一个字节。事实上,我猜你实际上使用的是 UTF-8,它将这个字符表示为三个字节 0xE2 0x96 0x81;但是如果没有看到呈现为类似下划线的字符,人类也绝对无法猜测这一点。
推荐阅读
- python - Flask:从具有关系的模型中预填充编辑表单
- vue.js - Vuelidate密码验证总是无效
- android - 为什么 DevTools 停止显示网络流量
- elasticsearch - 在提供的字符串(长文本)中查找所有匹配的 elasticsearch 文档
- android - 如何在前台服务中获取地理围栏事件
- eclipse - Eclipse Docker Tooling 命令行运行选项
- codenameone - 是否可以用特定字体替换模拟器中的“本机字体”?
- angular - 单击编辑按钮后如何从数据表中加载模态中的所有数据?
- c# - 设置不保存布尔值或 ushorts
- python - ImportError:无法从“sqlalchemy.orm.query”导入名称“_ColumnEntity”