Python语法错误:非ASCII

时间:2018-06-13 04:52:02

标签: python python-3.x syntax-error

我一直收到错误,而且我不确定如何修复它。

代码行:

if not len(lines) or lines[-1] == '' or lines[-1] == '▁':
    lines = list(filter(lambda line: False if line == '' or line == '▁' else True, list(lines)))

输出: SyntaxError:非ASCII字符' \ xe2'在第512行的文件prepare_data.py中,但没有声明编码;有关详细信息,请参阅http://python.org/dev/peps/pep-0263/

2 个答案:

答案 0 :(得分:2)

错误消息告诉您确切的错误。 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 -*-

如果您不知道编辑器使用哪种编码来保存此文件,请使用十六进制编辑器和一些Google搜索来检查它。 Stack Overflow 标记包含tag info page,其中包含更多信息和一些疑难解答提示。

在7位ASCII范围(0x00-0x7F)之外的许多词中,Python无法猜测字节序列代表什么字符串。 https://tripleee.github.io/8bit#e2显示了对字节0xE2的21种可能的解释,并且仅对传统的8位编码进行了解释。但它也可能是多字节编码的第一个字节。事实上,我猜你实际上是在使用UTF-8,它将这个字符表示为三个字节0xE2 0x96 0x81;但是,如果没有将角色看作类似于下划线的东西,那么对于人类来说绝对没有办法猜测这个。

答案 1 :(得分:0)

试试这个。我还没有对它进行测试,但我认为它可能会解决您的编码问题。您的代码需要对可读性进行一些改进,请记住Python的Zen。

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