Python “Sözdizimi Hatası: Dosyada ASCII olmayan '\ xe2' karakteri”


179

Bazı python kodu yazıyorum ve bu karakter kümesi ile yapmak zorunda arama başlığında olduğu gibi hata mesajı alıyorum.

İşte hataya neden olan çizgi

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

ANSI ASCII setinde hangi karakterin olmadığını anlayamıyorum? Ayrıca "\ xe2" araması, hangi karakter olarak göründüğü hakkında artık bilgi vermez. Bu satırdaki hangi karakter soruna neden oluyor?

Ayrıca bu sorun için birkaç düzeltme gördüm ama hangisini kullanacağımdan emin değilim. Birisi sorunun ne olduğunu açıklığa kavuşturabilir mi (python bunu yapmadıkça unicode'u yorumlamaz mı?) Ve nasıl düzgün bir şekilde temizlerdim?

DÜZENLEME: İşte hataya yakın olan tüm satırlar

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
Dosyanın üstüne # kodlama: utf-8 ekleyin.
Mutant

2
Gönderdiklerinizle ilgili bir sorun yok; yakındaki hatlara bakın.
tür

Bir tür düzenleme eklediniz, bu satırlarda bir şey görüyor musunuz?
KDecker

3
Mutant'ın önerisini denedin mi? Dosyanın herhangi bir yerinde "akıllı alıntılar" (eğri ve / veya açılı tür) var mı?
John Y

2
Buna neden olabilecek bir örnek EN DASH ( - \xe2\x80\x93)
Martin Thoma

Yanıtlar:


145

Etrafta yüzen başıboş bir bayt var. Koşarak bulabilirsiniz

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

"x.py"programınızın adı ile değiştirmelisiniz . Satır numarasını ve rahatsız edici satırları göreceksiniz. Örneğin, bu baytı keyfi olarak ekledikten sonra:

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

2
Teşekkürler bu çok yardımcı oldu! Şartın ne olduğundan / hala ne olduğundan emin değilim. Kodu not defterine atma ve ASCII olarak kaydetme ve yapıştırma işlemini bitirdim.
KDecker

Karakterin editörde (vim) boşluk olarak göründüğü bazı kopya yapıştırma sorunu nedeniyle olduğunu düşünüyorum.
Samveen

Python'un bu tür karakterlerin sadece başıboş bir bayt değil, bir sebepten dolayı orada olduğunu bilmesi gerekebilir. Chris Redford'un cevabındaki çözüme bakın.
simplyharsh

7
Ben de aynı sorunu yaşadım, karakter \ xe2 tire "-" (\ xe2 \ x80 \ x93), ama ascii "-" biraz daha uzun bir parçasıydı. Çünkü metni vim'e yapıştırdım, ancak bu uzun tireye dikkat etmedim. Hikayenin tamamı için, wiki metninde (tekstil kullanarak) çift tire "-" ile bu karakteri
ürettim

1
Benimki kesme işaretindeydi - olduğu gibiO'Donnell
user2490003

278

Sadece UTF-8 karakterlerini kullanmaya çalışıyorsanız veya kodunuzda olup olmadıklarını umursamıyorsanız, bu satırı .pydosyanızın üstüne ekleyin

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

1
benim için çalışmıyor. aşağıdaki hata her zaman gösteriliyor. Sözdizimi Hatası: 393 satırındaki /home/aslam/projects/deva_26nov/mylibrary/email_constants.py dosyasındaki ASCII olmayan '\ xe2' karakteri, ancak kodlama bildirilmedi; ayrıntılar için bkz. python.org/peps/pep-0263.html
Aslam Khan

2
Bunun seçilmiş bir cevap olmamasının bir nedeni var mı?
cph

@cph Soru sorulduktan 4 ay sonra yazdım :)
Chris Redford

@cph, çünkü bu çok yardımcı olsa da, seçilen cevap "ANSI ASCII setinde hangi karakter yok?" Her ikisi de iyi cevaplar ve birincisi genellikle bu durumda kazanır.
Arthur Dent

39

Veya sadece şunu kullanabilirsiniz:

# coding: utf-8

üstündeki .py dosyası


27

\ xe2 '-' karakteridir, bazı kopyalama ve yapıştırma işlemlerinde görünür ve kodlama hatalarına neden olan farklı bir eşit görünümlü '-' kullanır. '-' (kopya hamurundan) doğru '-' (klavye düğmenizden) ile değiştirin.


3
çok teşekkürler ! benim durumumda bu "'" karakteri
pietà

23

Dosya karakter kodlamasını değiştirme,

kodunuzun üst kısmına daima satırın altına koyun

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

10

Web'den bir yorum kopyalayıp yapıştırırken aynı hatayla karşılaştım

Benim için kelimede tek bir alıntı (')

Sadece sildim ve yeniden yazdım.


Aynı hatayla karşılaştım, ancak yerel olarak test ederken kırılmadı ve çalıştı. Ancak sunucuda çalıştırıldığında bu kodlama hatasını verdi. Utf-8 sürüm yorum tek tırnak değiştirmek zorunda kaldı.
shivgre


4

Yorumlarımdaki karakterler için bu hatayı aldım (not alma amacıyla web'den içerik kopyalayıp düzenleyicime yapıştırarak).

Metin Wrangler'da çözmek için:

  1. Metni vurgulayın
  2. Metin menüsüne gidin
  3. "ASCII'ye Dönüştür" ü seçin

2
Seçenek TextWrangler'ın sonraki sürümlerinde text-> zap gremlinleri olarak değiştirildi, ancak benim için çalıştı :-)
TheMethod

4

Dayanarak tanımlanması Python Kaynak Kod Kodlamalar - PEP 0263

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

ancak ilk yorumdan soruya kadar çalıştı, cevap açıklamayı içeriyor. teşekkürler
WebComer

3

Ben aynı sorunu vardı ve sadece benim dosya üstüne ekledi (Python 3 ben sorun yoktu ama Python 2 yapmak

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

2

Yığın taşmasına baktıktan yaklaşık yarım saat sonra, bir yorumda tek bir alıntı "" "kullanmanın hatadan geçeceği bana şaştı:

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

Geri izleme baktıktan sonra benim yorumda kullanılan tek teklif bulmak mümkün.


2

Kimseye yardımcı olursa, python 2.7 komutumla python 3.4'te bir Django uygulaması çalıştırmaya çalıştığım için oldu.


Django kullanmıyordum, ama bu hala bana yardımcı oldu. Ben komut dosyasını python 3 kullanarak yazdım ve python 2 ile çalıştırmayı denedim. Doğru sürümle çalıştırdığımda hata gitti. Teşekkürler!
JustBlossom

1

Aşağıdaki basit .py kodunu çalıştıran bu kesin sorunu vardı:

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

Yukarıdaki DSM kodu aşağıdakileri sağlamıştır:

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

Sorun, metin düzenleyicimin John Y'nin önerdiği gibi SMART QUOTES kullanmasıydı. Metin düzenleyici ayarlarını değiştirdikten ve dosyayı yeniden açtıktan / kaydettikten sonra gayet iyi çalışıyor.


1

Ben garip windows kesme işareti ayrıştırmak için çalışıyorum ve burada birkaç şey denedikten sonra çalışan kod snippet olduğunu.

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

Ben aynı sorunu vardı ama ben kopyalandı ve olduğu gibi dize yapıştırdığı için oldu. Daha sonra ben hata ortadan kaybolduğu gibi dize elle yazdığınızda.

-Işaret nedeniyle hatayla karşılaştım . Manuel giriş ile değiştirdiğimde -hata çözüldü.

Kopyalanan dize 10 + 3 * 5/(16 − 4)

Manuel olarak yazılan dize 10 + 3 * 5/(16 - 4)

her iki tire arasında biraz fark olduğunu açıkça görebilirsiniz .

Bence farklı işletim sistemi tarafından kullanılan farklı biçimlendirme veya belki de sadece farklı yazılımlar.


0

Benim için sorun tırnak içindeki "" "işaretinden kaynaklanmıştı. Ben bir pdf dosyasından kodu kopyalamış gibi bu hataya neden oldu. Az önce "" "yerine bu" "" ifadesini koydum.


0

Hangi karakterin buna neden olduğunu tespit etmek istiyorsanız, sorunlu değişkeni bir dizeye atayın ve bir iPython konsolunda yazdırın.

Benim durumumda

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

benim için sorun, kodumu Mac Notes'a yazıp Mac Notes'tan kopyalayıp dosyamı oluşturmak için vim oturumuma yapıştırmaktan kaynaklandı. Bu benim tek tırnak kavisli tip yaptı. düzeltmek için vim dosyamı açtım ve sadece aynı karakteri kaldırarak ve yeniden yazarak tüm kavisli tek tırnaklarımı düz türle değiştirdim. Aynı tuş vuruşunu kavisli tek alıntı yapan Mac Notes'tur.


0

Sorunun ne olduğunu uzun süre bulamadım, ancak daha sonra web'den bir "UTC-12: 00" satırı kopyaladığımı fark ettim ve buradaki tire / tire soruna neden oluyordu. Ben sadece bu "-" yazdım ve sorun çözüldü.

Bu nedenle, bazen kopya yapıştırılan satırlar da hatalar verir. Bu gibi durumlarda, yapıştırılan kopyayı yeniden yazın ve çalışır. Yeniden yazmada, hiçbir şey değişmemiş gibi görünüyor, ancak hata gidecek.


-1

Metin dosyaları okurken benzer bir sorun olduğunda ben kullanıyorum ...

f = open('file','rt', errors='ignore')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.