Python“SyntaxError:文件中的非ASCII字符'\ xe2'”

213

我正在编写一些Python代码,但是在标题中所述的错误消息中得到了错误提示。从搜索结果来看,这与字符集有关。

这是导致错误的那一行:

hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")

我无法确定哪个字符不在ANSI ASCII集合中?而且搜索"\xe2"并没有提供有关显示为什么字符的更多信息。在这一行中,哪个字符引起了问题?

我也看到了一些解决此问题的方法,但我不确定要使用哪种方法。有人能澄清一下这个问题是什么(Python除非被告知如何解释Unicode,否则它不会解释Unicode),以及我应该如何正确地解决它吗?

编辑:以下是所有与出错行相邻的行:

def createLoadBalancer():
    conn = ELBConnection(creds.awsAccessKey, creds.awsSecretKey)
    hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")
    lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])
    lb.configure_health_check(hc)
    return lb

75
请在文件顶部添加 # coding: utf-8。 - Mutant
2
你发布的内容没有问题;请查看附近的行。 - kindall
4
你尝试过Mutant的建议了吗?文件中是否有“智能引号”(弯曲和/或倾斜的那种)? - John Y
是的,突变体起作用了,同时使用记事本或其他工具将文件保存为ASCII格式,然后像往常一样使用它。 - KDecker
4
可能导致此问题的一个例子是EN破折号( - \xe2\x80\x93)。 - Martin Thoma
显示剩余3条评论
23个回答

3
如果对任何人有所帮助,我这样做是因为我试图在Python 3.4中运行Django实现,但我使用了Python 2.7命令。

1
没有使用Django,但这仍然对我有帮助。我使用Python 3编写了脚本并尝试用Python 2运行它。当我使用正确的版本运行时,错误消失了。谢谢! - JustBlossom

3

在我的情况下,\xe2应该被替换为'

一般来说,我建议使用例如https://onlineasciitools.com/convert-utf8-to-ascii的工具将UTF-8转换为ASCII。

然而,如果你想保留UTF-8,你可以使用

#-*- mode: python -*-
# -*- coding: utf-8 -*-

2

在浏览了大约半个小时的Stack Overflow后,我恍然大悟,如果在注释中使用单引号“'”,将会出现错误:

SyntaxError: Non-ASCII character '\xe2' in file

查看回溯信息后,我成功找到了我的评论中使用的单引号。


1

我试图解析那个奇怪的Windows撇号,经过尝试了几种方法,这里是可行的代码片段。

def convert_freaking_apostrophe(self,string):

   try:
      issuer_rename = string.decode('windows-1252')
   except:
      issuer_rename = string.decode('latin-1')
   issuer_rename = issuer_rename.replace(u'’', u"'")
   issuer_rename = issuer_rename.encode('ascii','ignore')
   try:
      os.rename(directory+"/"+issuer,directory+"/"+issuer_rename)
      print "Successfully renamed "+issuer+" to "+issuer_rename
      return issuer_rename
   except:
      pass

#HANDLING FOR FUNKY APOSTRAPHE
if re.search(r"([\x90-\xff])", issuer):
   issuer = self.convert_freaking_apostrophe(issuer)

1

我曾经遇到过与下面这个简单的.py代码相同的问题:

import sys
print 'version is:', sys.version

DSM的代码提供了以下内容:

1 'print \'version is\', sys.version'

问题在于我的文本编辑器使用了SMART QUOTES,正如John Y所建议的那样。更改文本编辑器设置并重新打开/保存文件后,它就可以正常工作了。


1
我使用Pycharm修复了这个问题。在Pycharm的底部,您可以看到文件编码。我注意到它是UTF-8。我将其更改为US-ASCII。 pycharm encoding depiction

0
如果您想找出是哪个字符导致了这个问题,只需将有问题的变量分配给一个字符串,并在iPython控制台中打印它即可。
在我的情况下。
In [1]: array = [[24.9, 50.5]​, [11.2, 51.0]]        # Raises an error

In [2]: string = "[[24.9, 50.5]​, [11.2, 51.0]]"     # Manually paste the above array here

In [3]: string
Out [3]: '[[24.9, 50.5]\xe2\x80\x8b, [11.2, 51.0]]' # Here they are!

0
对我来说,问题是由于将我的代码输入到Mac Notes中,然后从Mac Notes复制并粘贴到我的vim会话中创建文件引起的。这使得我的单引号变成了弯曲的类型。为了解决这个问题,我在vim中打开了我的文件,并用直角的单引号替换了所有的弯曲单引号,只需删除并重新输入相同的字符即可。是Mac Notes使得相同的按键产生了弯曲的单引号。

0

我曾经遇到过同样的问题,但那是因为我直接复制粘贴了字符串。 后来当我手动输入相同的字符串时,错误就消失了。

我的错误是由于 - 符号引起的。当我手动输入一个 - 时,错误就解决了。

复制的字符串为 10 + 3 * 5/(16 − 4)

手动输入的字符串为 10 + 3 * 5/(16 - 4)

你可以清楚地看到两个连字符之间有一些差异。

我认为这可能是由于不同操作系统或不同软件使用了不同的格式化方式所致。


1
你可能是从某个博客或类似网站复制/粘贴的,其软件会偷偷地将连字符和各种引号字符替换为“排版美观”但不兼容的字形。 - tripleee

0
对我来说,问题是由于引号中的 "’" 符号导致的。因为我从 PDF 文件中复制了代码,所以导致了这个错误。我只需将 "’" 替换为 "'".

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接