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


179

我正在编写一些python代码,并且从标题中收到错误消息,如标题所示,这与字符集有关。

这是导致错误的行

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

我无法确定ANSI ASCII字符集中没有哪个字符?此外,搜索“ \ xe2”不再提供有关显示为哪个字符的信息。该行中的哪个字符导致了问题?

我也看到了一些针对此问题的修复程序,但是我不确定该使用哪个修复程序。有人可以弄清楚问题是什么(除非被告知这样做,否则python不会解释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

63
在文件顶部添加#编码:utf-8。
突变2014年

2
您发布的内容没有问题;看附近的线。
kindall 2014年

添加了edit kindall,在这些行中看到任何内容吗?
KDecker 2014年

3
您是否尝试过Mutant的建议?文件中的任何地方都有“智能引号”(弯曲和/或成角度的类型)吗?
约翰Y

2
EN DASH(- \xe2\x80\x93
Martin Thoma

Answers:


145

您有一个流浪字节浮动。您可以通过运行找到它

with open("x.py") as fp:
    for i, line in enumerate(fp):
        if "\xe2" in line:
            print i, repr(line)

在其中应替换"x.py"为程序名称。您会看到行号和有问题的行。例如,在任意插入该字节后,我得到:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"

2
谢谢,这帮了很多忙!仍然不确定章程是什么。我最终将代码扔到记事本中,另存为ASCII,然后粘贴。
KDecker 2014年

我也遇到了这个问题,我认为这是由于某些复制粘贴问题而导致的,在编辑器(vim)中字符显示为空格。
Samveen 2014年

可能需要让python知道这些字符存在是有原因的,而不仅仅是一个流浪字节。请参阅Chris Redford的答案中的解决方案。
Simplyharsh 2014年

7
我遇到了同样的问题,字符\ xe2是连字符“-”(\ xe2 \ x80 \ x93)的一部分,但比ASCII“-”稍长。那是因为我将文本粘贴到了vim中,但是没有注意这个较长的连字符。对于全文,我在Wiki文本中(使用纺织品)使用双连字符“-”制作了此角色
-PlasmaBinturong

1
我是在撇号-如O'Donnell
user2490003

277

如果您只是尝试使用UTF-8字符,或者不在乎代码中是否包含这些字符,请将此行添加到.py文件顶部

# -*- coding: utf-8 -*-

1
对我来说,它不起作用。以下错误始终显示。语法错误:第393行的文件/home/aslam/projects/deva_26nov/mylibrary/email_constants.py中的非ASCII字符'\ xe2',但未声明编码;有关详细信息,请参见python.org/peps/pep-0263.html
Aslam Khan

2
这不是选择答案的原因吗?
cph

@cph我在问了问题四个月后写了它:)
克里斯·雷德福德

@cph因为这虽然很有帮助,但选择的答案回答了“ ANSI ASCII集中没有哪个字符?”的问题。两者都是很好的答案,在这种情况下,第一个通常会获胜。
亚瑟·登特

39

或者您可以简单地使用:

# coding: utf-8

.py文件顶部


27

\ xe2是'-'字符,它出现在某些复制和粘贴过程中,它使用不同的等号'-'导致编码错误。用正确的“-”(通过键盘按钮)替换“-”(来自复制粘贴)。


3
非常感谢 !在我的情况下,它是“'”字符
圣母怜子


10

从网络复制和粘贴评论时出现相同的错误

对我来说,这是一个单引号(')

我只是将其擦除并重新输入。


我有同样的错误,但是在本地测试时,它没有中断并无法正常工作。但是当在服务器上运行时,它给出了编码错误。不得不将注释单引号替换为utf-8版本。
shivgre


4

我在注释中遇到了字符错误(从网络上将内容复制/粘贴到编辑器中以做笔记)。

要在文本牧马人中解决:

  1. 突出显示文字
  2. 转到文本菜单
  3. 选择“转换为ASCII”

2
在更高版本的TextWrangler中,选项已更改为text-> zap gremlins,但对我
有用

4

基于PEP 0263-定义Python源代码编码

Python will default to ASCII as standard encoding if no other
encoding hints are given.

To define a source code encoding, a magic comment must
be placed into the source files either as first or second
line in the file, such as:

      # coding=<encoding name>

or (using formats recognized by popular editors)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

or

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :

然而,从第一个评论到问题,它的答案都包含了解释。谢谢
WebComer

3

我遇到了同样的问题,只是将其添加到文件的顶部(在Python 3中,我没有问题,但在Python 2中有问题

#!/usr/local/bin/python
# coding: latin-1

2

在查看堆栈溢出大约半小时之后,我突然意识到,如果在注释中使用单引号“'”将解决错误:

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

在查看了追溯之后,我能够找到我的注释中使用的单引号。


2

如果它对任何人都有用,那对我来说是发生了,因为我试图使用python 2.7命令在python 3.4中运行Django实现


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

1

我在运行以下简单的.py代码时遇到了这个确切的问题:

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

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

1'print \ xe2 \ x80 \ x98version is \ xe2 \ x80 \ x99,sys.version'

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


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)

0

我遇到了同样的问题,但这是因为我原样复制并粘贴了字符串。稍后,当我手动键入字符串时,错误消失了。

由于-标志,我出现了错误。当我用手动输入替换它时,-错误解决了。

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

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

您可以清楚地看到两个连字符之间存在一些差异。

我认为这是因为不同的OS或不同的软件使用了不同的格式。


0

对我来说,问题是由于引号中的符号“'”引起的。由于我已经从pdf文件复制了代码,因此导致了该错误。我只是用“”代替“”。


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

很长时间以来,我一直找不到问题所在,但后来我意识到我已经从Web复制了一行“ UTC-12:00”,而其中的连字符/破折号引起了问题。我只是再次写了这个“-”,问题就解决了。

因此,有时复制粘贴的行也会产生错误。在这种情况下,只需重写复制粘贴的代码即可。重写后,看起来什么都没有改变,但是错误消失了。


-1

当我阅读文本文件时遇到类似问题时,我会使用...

f = open('file','rt', errors='ignore')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.