我一直收到错误,而且我不确定如何修复它。
代码行:
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/
答案 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 character-encoding标记包含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)))