Python语法错误:非ASCII

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)))