Python语法错误:非ASCII [重复]

yxyvkwin  于 2023-03-31  发布在  Python
关注(0)|答案(2)|浏览(119)

此问题在此处已有答案

"SyntaxError: Non-ASCII character ..." or "SyntaxError: Non-UTF-8 code starting with ..." trying to use non-ASCII text in a Python script(7个答案)
四年前关闭了。
我一直得到一个错误,我不知道如何修复它。
代码行:

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

输出:语法错误:文件prepare_data.py中第512行的非ASCII字符'\xe2',但未声明编码;详情请参见http://python.org/dev/peps/pep-0263/

1dkrff03

1dkrff031#

错误信息告诉你到底哪里出了问题。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 -*-

如果你不知道你的编辑器使用哪种编码来保存这个文件,可以用十六进制编辑器和一些谷歌搜索来检查它。堆栈溢出character-encoding标签有一个tag info page,其中包含更多信息和一些故障排除提示。
换句话说,在7位ASCII范围(0x 00 - 0x 7 F)之外,Python不能也不应该猜测字节序列表示的字符串。https://tripleee.github.io/8bit#e2显示了字节0xE 2的21种可能的解释,这只是来自传统的8位编码;实际上,我猜您实际上使用的是UTF-8,它将这个字符表示为三个字节0xE 2 0x 96 0x 81;但是如果没有看到呈现为类似下划线的字符,人类也绝对没有办法猜到这一点。

djp7away

djp7away2#

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

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

相关问题