首页 > 解决方案 > 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/

标签: pythonpython-3.xsyntax-error

解决方案


错误消息会告诉您究竟出了什么问题。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;但是如果没有看到呈现为类似下划线的字符,人类也绝对无法猜测这一点。


推荐阅读