Python Syntax error: non-ASCII
本问题已经有最佳答案,请猛点这里访问。
我一直有一个错误,我不确定如何解决它。
代码行:
1 2 | if not len(lines) or lines[-1] == '' or lines[-1] == '▁': lines = list(filter(lambda line: False if line == '' or line == '▁' else True, list(lines))) |
输出:语法错误:文件中的非ASCII字符'xe2'在第512行准备u data.py,但未声明编码;有关详细信息,请参阅http://python.org/dev/peps/pep-0263/。
错误消息确切地告诉您出了什么问题。python解释器需要知道字符串中字节的编码,该字符串显示为一个时髦的下划线。
如果你想匹配U+2581,你可以说
1 | .... or lines[-1] == '\u2581': |
它通过Unicode转义序列以纯ASCII表示此字符。如果要匹配常规的ASCII下划线,则为ASCII 95/U+005F;下面是并排的两个字符,便于比较和可能的复制/粘贴:
1 | U+2581 ▁ _ U+005F |
错误消息中链接的PEP将指导您如何准确地告诉python"这个文件不是纯ASCII;这里是我使用的编码"。如果编码是utf-8,那就是
1 | # coding=utf-8 |
或Emacs兼容
1 | # -*- encoding: utf-8 -*- |
如果您不知道编辑器使用哪种编码来保存此文件,可以使用十六进制编辑器和一些谷歌搜索来检查它。堆栈溢出字符编码标记有一个标记信息页,其中包含更多信息和一些疑难解答提示。
换句话说,在7位ASCII范围(0x00-0x7f)之外,python不能也不能猜测字节序列代表的字符串。https://triplee.github.io/8bit e2显示了21个字节0xe2的可能解释,这仅来自于传统的8位编码;但它也很可能是多字节编码的第一个字节。事实上,我猜您实际上使用的是utf-8,它将这个字符表示为三个字节0xe2 0x96 0x81;但是如果不同时看到呈现为类似于下划线的字符,那么对于人类来说也绝对没有办法猜到这一点。
试试这个。我还没有测试过它,但我认为它可以解决您的编码问题。您的代码在可读性方面需要一些改进,请记住python的禅。
1 2 3 4 5 6 7 8 9 10 | def filter_line(line): if not line or line == '▁': return False else: return True lines = [line.encode("utf-8") for line in lines] if not lines or lines[-1] == '' or lines[-1] == '▁': lines = list(filter(filter_lines, list(lines))) |