【问题标题】:Python "SyntaxError: Non-ASCII character '\xe2' in file" [duplicate]Python“语法错误:文件中的非ASCII字符'\ xe2'” [重复]
【发布时间】:2014-03-05 13:05:10
【问题描述】:

我正在编写一些 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

【问题讨论】:

  • 在文件顶部添加#coding: utf-8。
  • 你发的没问题;查看附近的线路。
  • 添加了一个编辑,看看这些行中有什么吗?
  • 你尝试过 Mutant 的建议吗?您在文件中的任何位置是否有“智能引号”(弯曲和/或有角度的引号)?
  • 一个可能导致它的示例是 EN DASH ( - \xe2\x80\x93)

标签: python


【解决方案1】:

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

f = open('file','rt', errors='ignore')

【讨论】:

  • 这是一个糟糕的建议。你应该找出正确的编码;丢弃您不认识的字符只会破坏数据。无论如何,这个问题询问的是 Python 源代码中的编码,而不是输入文本文件中的编码。
【解决方案2】:

你有一个杂散字节浮动。你可以通过运行找到它

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"

【讨论】:

  • 感谢这有很大帮助!仍然不确定章程是什么。我最终将代码扔到记事本中并保存为 ASCII,然后粘贴。
  • 我也遇到了这个问题,我认为这是由于一些复制粘贴问题,字符在编辑器(vim)中显示为空白。
  • 我遇到了同样的问题,字符 \xe2 是连字符“-”(\xe2\x80\x93)的一部分,但比 ascii“-”稍长。那是因为我将文本粘贴到vim中,但没有注意这个较长的连字符。对于完整的故事,我在 wiki 文本中使用双连字符“--”制作了这个角色(使用纺织品)
  • 我的是一个撇号 - 如O'Donnell
  • 对于寻找问题角色的人,this table is useful。 “UTF-8 Bytes”列中以%E2 开头的所有内容都是候选对象。通常,问题是在打开“智能”功能的情况下编辑代码,例如“智能引号”将" 替换为 (U+201C) 和 (U+201D) 或将-- 转换为 ( U+2014 破折号)。所有这些都以 UTF-8 中的“\xe2\x80”开头。
【解决方案3】:

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

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

【讨论】:

  • 对我来说它不起作用。始终显示以下错误。 SyntaxError:第 393 行的文件 /home/aslam/projects/deva_26nov/mylibrary/email_constants.py 中的非 ASCII 字符“\xe2”,但未声明编码;详情见python.org/peps/pep-0263.html
  • 这不是一个选择的答案有什么原因吗?
  • @cph 我是在提出问题 4 个月后写的 :)
  • @cph 因为虽然这很有帮助,但选择的答案回答了“什么字符不在 ANSI ASCII 集中?”的问题。虽然两者都是很好的答案,但在这种情况下,第一个通常会获胜。
  • 这个答案对我有用,我认为它是正确的。
【解决方案4】:

我的 cmets 中的字符出现此错误(出于记笔记的目的,从网络复制/粘贴内容到我的编辑器)。

在 Text Wrangler 中解决:

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

【讨论】:

  • 选项已更改为 text->zap gremlins,在 TextWrangler 的更高版本中,但它对我有用 :-)
【解决方案5】:

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

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

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

1 '打印\xe2\x80\x98版本是\xe2\x80\x99, sys.version'

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

【讨论】:

    【解决方案6】:

    更改文件字符编码,

    始终将下一行放在代码顶部

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

    【讨论】:

      【解决方案7】:

      我在从网上复制和粘贴评论时遇到了同样的错误

      对我来说,它是单词中的单引号 (')

      我只是把它擦掉,然后重新输入。

      【讨论】:

      • 我遇到了同样的错误,但是在本地测试时它并没有中断并且可以正常工作。但是当在服务器上运行时,它给出了编码错误。不得不将 cmets 单引号替换为 utf-8 版本。
      【解决方案8】:

      基于PEP 0263 -- Defining Python Source Code Encodings

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

      【讨论】:

      • 但它从第一条评论到问题都有效,答案包含解释。谢谢
      【解决方案9】:

      我正在尝试解析那个奇怪的窗口撇号,在这里尝试了几件事后,代码 sn-p 就可以工作了。

      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)
      

      【讨论】:

        【解决方案10】:

        查看堆栈溢出大约半小时后,我突然意识到,如果在评论中使用单引号“'”将通过错误:

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

        查看回溯后,我能够找到评论中使用的单引号。

        【讨论】:

          【解决方案11】:

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

          【讨论】:

          • 非常感谢!就我而言,它是“'”字符
          • 0xE2 不是任何常见编码中的连字符。不过,它是许多常见字符(如非 ASCII 连字符和引号)的 UTF-8 编码的一部分。
          【解决方案12】:

          或者你可以简单地使用:

          # coding: utf-8
          

          在 .py 文件的顶部

          【讨论】:

            【解决方案13】:

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

            由于- 符号,我遇到了错误。当我用手动输入- 替换它时,错误就解决了。

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

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

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

            我认为这是因为不同操作系统使用的格式不同,或者可能只是不同的软件。

            【讨论】:

            • 可能是您从某个博客或类似博客中复制/粘贴,其软件偷偷地将连字符和各种引用字符替换为“排版上令人愉悦”但不兼容的字形。
            【解决方案14】:

            如果它对任何人有帮助,对我来说发生这种情况是因为我试图使用我的 python 2.7 命令在 python 3.4 中运行 Django 实现

            【讨论】:

            • 没有使用 Django,但这仍然对我有帮助。我使用 python 3 编写了脚本并尝试使用 python 2 运行它。当我使用正确的版本运行它时,错误消失了。谢谢!
            【解决方案15】:

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

            【讨论】:

              【解决方案16】:

              如果你想找出是什么字符导致了这种情况,只需将有问题的变量分配给一个字符串并在 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!
              

              【讨论】:

                【解决方案17】:

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

                【讨论】:

                  【解决方案18】:

                  在 .py 文件的第一行添加 #coding=utf-8 行将解决问题。

                  请在下面的链接中阅读有关该问题及其解决方案的更多信息,在本文中问题及其解决方案得到了精美的描述:https://www.python.org/dev/peps/pep-0263/

                  【讨论】:

                    【解决方案19】:

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

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

                    【讨论】:

                    • 如果您的来源不是实际上 Latin-1,这将是非常错误的。您需要找出正确的编码,然后将其添加到coding: 规范中。
                    【解决方案20】:

                    我很长时间都找不到问题所在,但后来我意识到我从网上复制了一行“UTC-12:00”,而其中的连字符/破折号导致了问题。我刚刚又写了这个“-”,问题就解决了。

                    所以,有时复制粘贴的行也会出错。在这种情况下,只需重新编写复制粘贴的代码即可。重写时,看起来没有任何改变,但错误会消失。

                    【讨论】:

                      【解决方案21】:

                      我的情况 \xe2 是 ,应该替换为 '

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

                      但是,如果您想保留 UTF-8,您可以使用

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

                      【讨论】:

                        【解决方案22】:

                        这里有很多好的解决方案。

                        其中任何一个都没有真正解决的一个挑战是如何在视觉上识别某些难以发现的非 ASCII 字符,这些字符类似于其他纯 ASCII 字符。例如,短划线几乎可以像连字符一样出现,而花引号看起来很像直引号,具体取决于您的文本编辑器的字体。

                        这个单行,应该在 Mac 或 Linux 上工作,将删除不在 ASCII 可打印范围内的字符,并并排显示差异:

                        # assumes Bash shell; for Bourne shell (sh), rearrange as a pipe and
                        # give '-' as second argument to 'sdiff' instead
                        sdiff --suppress-common-lines script.py <(tr -cd '\11\12\15\40-\176' <script.py)
                        

                        字符\11\12\15分别是八进制制表符、换行符和回车符;剩下的范围是可见的 ASCII 字符。 (hat tip)

                        this SO thread 收集到的另一个提示使用由 ASCII 可见范围内的任何内容组成的反字符类,并将其突出显示:

                        grep --color '[^ -~]' script.py
                        

                        这也应该适用于 macOS / BSD 版本的 grep。

                        【讨论】:

                          【解决方案23】:

                          我使用 pycharm 解决了这个问题。在 pycharm 底部可以看到文件编码。我注意到它是UT-8。我把它改成了 US-ASCII

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2015-01-06
                            • 1970-01-01
                            • 2014-10-01
                            • 1970-01-01
                            • 2014-12-06
                            • 2019-06-20
                            • 2011-09-05
                            • 2011-03-16
                            相关资源
                            最近更新 更多