Python "SyntaxError: Non-ASCII karakter '\ xe2' dalam file"

179

Saya menulis beberapa kode python dan saya menerima pesan kesalahan seperti pada judul, dari pencarian ini ada hubungannya dengan set karakter.

Inilah baris yang menyebabkan kesalahan

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

Saya tidak tahu karakter apa yang tidak ada dalam set ANSI ASCII? Selanjutnya mencari "\ xe2" tidak memberikan informasi lagi mengenai karakter apa yang muncul. Karakter mana di baris itu yang menyebabkan masalah?

Saya juga melihat beberapa perbaikan untuk masalah ini, tetapi saya tidak yakin mana yang harus digunakan. Bisakah seseorang mengklarifikasi apa masalahnya (python tidak menafsirkan unicode kecuali disuruh melakukannya?), Dan bagaimana saya akan menjernihkannya dengan benar?

EDIT: Berikut adalah semua baris di dekat salah satu yang salah

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
KDecker
sumber
63
tambahkan # coding: utf-8 di atas file.
Mutant
2
Tidak ada masalah dengan apa yang Anda posting; lihat di garis terdekat.
ramah
Menambahkan edit kindall, lihat apa saja di baris itu?
KDecker
3
Apakah Anda mencoba saran Mutant? Apakah Anda memiliki "kutipan pintar" (jenis melengkung dan / atau miring) di mana saja dalam file?
John Y
2
Salah satu contoh yang mungkin menyebabkannya adalah EN DASH ( - \xe2\x80\x93)
Martin Thoma

Jawaban:

145

Anda punya byte liar yang melayang-layang. Anda dapat menemukannya dengan menjalankan

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

di mana Anda harus mengganti "x.py"dengan nama program Anda. Anda akan melihat nomor baris dan baris yang menyinggung. Misalnya, setelah memasukkan byte itu secara sewenang-wenang, saya mendapat:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"
DSM
sumber
2
Terima kasih, ini banyak membantu! Masih tidak yakin apa piagam itu. Saya akhirnya membuang kode di notepad dan menyimpan sebagai ASCII, dan kemudian menempel.
KDecker
Saya menghadapi ini juga, yang saya pikir disebabkan oleh beberapa masalah copy paste, di mana karakter muncul sebagai spasi di editor (vim).
Samveen
Mungkin diperlukan untuk memiliki python tahu bahwa karakter seperti itu ada karena suatu alasan dan bukan hanya byte sesat. Lihat solusinya dalam jawaban Chris Redford.
simplyharsh
7
Saya memiliki masalah yang sama, karakter \ xe2 adalah bagian dari tanda hubung "-" (\ xe2 \ x80 \ x93), tetapi sedikit lebih panjang dari ascii "-". Itu karena saya menempelkan teks ke vim, tetapi tidak memperhatikan tanda hubung yang lebih lama ini. Untuk cerita selengkapnya, saya membuat karakter ini dengan tanda hubung ganda "-" dalam teks wiki (menggunakan tekstil)
PlasmaBinturong
1
O'Donnell
Milik
278

Jika Anda hanya mencoba menggunakan karakter UTF-8 atau tidak peduli apakah mereka ada dalam kode Anda, tambahkan baris ini ke bagian atas .pyfile Anda

# -*- coding: utf-8 -*-
Chris Redford
sumber
1
bagi saya itu tidak berfungsi. kesalahan di bawah ini menunjukkan selalu. SyntaxError: Non-ASCII karakter '\ xe2' dalam file /home/aslam/projects/deva_26nov/mylibrary/email_constants.py pada baris 393, tetapi tidak ada enkode yang dinyatakan; lihat python.org/peps/pep-0263.html untuk detailnya
Aslam Khan
2
Apakah ada alasan mengapa ini bukan jawaban yang dipilih?
cph
@ cph Saya menulisnya 4 bulan setelah pertanyaan diajukan :)
Chris Redford
@ cph karena, sementara ini sangat membantu, jawaban yang dipilih menjawab pertanyaan "karakter apa yang tidak ada dalam set ANSI ASCII?" Keduanya adalah jawaban yang baik dan yang pertama biasanya menang dalam kasus itu.
Arthur Dent
39

Atau Anda cukup menggunakan:

# coding: utf-8

di atas file .py

Ysh
sumber
27

\ xe2 adalah karakter '-', muncul di beberapa salin dan tempel menggunakan 'sama - sama tampak' - 'yang menyebabkan kesalahan pengkodean. Ganti '-' (dari copy paste) dengan benar '-' (dari tombol keyboard Anda).

André Liu
sumber
3
Terima kasih banyak ! dalam kasus saya itu adalah karakter "'"
pietà
23

Ubah pengkodean karakter file,

letakkan di bawah baris ke atas kode Anda selalu

# -*- coding: utf-8 -*-
Dadaso Zanzane
sumber
10

Saya memiliki kesalahan yang sama saat menyalin dan menempel komentar dari web

Bagi saya itu adalah kutipan tunggal (') dalam kata tersebut

Saya baru saja menghapusnya dan mengetik ulang.

sookia khalid
sumber
Saya memiliki kesalahan yang sama, tetapi saat menguji secara lokal itu tidak rusak dan berfungsi. Tetapi ketika dijalankan di server itu memberikan kesalahan pengkodean itu. Harus mengganti komentar kutipan tunggal ke versi utf-8.
shivgre
8

Menambahkan # coding = utf-8 baris di baris pertama file .py Anda akan memperbaiki masalah.

Silakan baca lebih lanjut tentang masalah dan perbaikannya di tautan di bawah ini, dalam artikel ini masalah dan solusinya dijelaskan dengan indah: https://www.python.org/dev/peps/pep-0263/

Bhupinder Yadav
sumber
4

Saya mendapatkan kesalahan ini untuk karakter dalam komentar saya (dari menyalin / menempelkan konten dari web ke editor saya untuk keperluan pencatatan).

Untuk mengatasi di Text Wrangler:

  1. Sorot teks
  2. Buka menu Teks
  3. Pilih "Konversikan ke ASCII"
Kat Russo
sumber
2
Opsi telah diubah menjadi text-> zap gremlins, dalam versi TextWrangler yang lebih baru tetapi berhasil bagi saya :-)
TheMethod
4

Berdasarkan PEP 0263 - Menentukan Penyandi Kode Sumber 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> :
caot
sumber
namun mulai dari komentar pertama hingga pertanyaan, jawabannya berisi penjelasan. terima kasih
WebComer
3

Saya memiliki masalah yang sama dan hanya menambahkan ini ke bagian atas file saya (dengan Python 3 saya tidak memiliki masalah tetapi lakukan di Python 2

#!/usr/local/bin/python
# coding: latin-1
Paul Z
sumber
2

Setelah sekitar setengah jam melihat melalui stack overflow, Saya sadar bahwa jika penggunaan satu kutipan "" dalam komentar akan melalui kesalahan:

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

Setelah melihat traceback saya dapat menemukan kutipan tunggal yang digunakan dalam komentar saya.

Mark Austin
sumber
2

Jika itu membantu siapa pun, bagi saya itu terjadi karena saya mencoba menjalankan implementasi Django di python 3.4 dengan perintah python 2.7 saya

aless80
sumber
Tidak menggunakan Django, tetapi ini masih membantu saya. Saya menulis skrip menggunakan python 3 dan mencoba menjalankannya dengan python 2. Kesalahan hilang ketika saya menjalankannya dengan versi yang tepat. Terima kasih!
JustBlossom
1

Saya mengalami masalah ini dengan menjalankan kode .py sederhana di bawah ini:

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

Kode DSM di atas memberikan yang berikut:

1 'cetak \ xe2 \ x80 \ x98 versi adalah \ xe2 \ x80 \ x99, sys.version'

Jadi masalahnya adalah editor teks saya menggunakan SMART QUOTES, seperti yang disarankan John Y. Setelah mengubah pengaturan editor teks dan membuka kembali / menyimpan file, itu berfungsi dengan baik.

nagrom
sumber
1

Saya mencoba mengurai jendela aneh itu dan setelah mencoba beberapa hal di sini adalah potongan kode yang berfungsi.

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)
Chris
sumber
0

Saya memiliki masalah yang sama tetapi itu karena saya menyalin dan menempelkan string seperti itu. Kemudian ketika saya mengetik string secara manual karena kesalahannya hilang.

Saya memiliki kesalahan karena -tandanya. Ketika saya menggantinya dengan memasukkan -kesalahan secara manual diselesaikan.

String yang disalin 10 + 3 * 5/(16 − 4)

String yang diketik secara manual 10 + 3 * 5/(16 - 4)

Anda dapat dengan jelas melihat ada sedikit perbedaan antara kedua tanda hubung .

Saya pikir itu karena format yang berbeda yang digunakan oleh OS yang berbeda atau mungkin hanya perangkat lunak yang berbeda.

Mahi
sumber
0

Bagi saya masalah telah disebabkan karena simbol "" dalam kutipan. Karena saya telah menyalin kode dari file pdf itu menyebabkan kesalahan itu. Saya baru saja mengganti "'" dengan ini "'".

Vineet Bramhankar
sumber
0

Jika Anda ingin mengetahui karakter apa yang menyebabkan ini, tetapkan saja variabel yang bermasalah ke sebuah string dan cetaklah di konsol iPython.

Dalam kasus saya

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!
meong meong
sumber
0

bagi saya, masalah itu disebabkan oleh mengetik kode saya ke Catatan Mac dan kemudian menyalinnya dari Catatan Mac dan disisipkan ke sesi vim saya untuk membuat file saya. Ini membuat single saya mengutip tipe melengkung. untuk memperbaikinya saya membuka file saya di vim dan mengganti semua tanda kutip tunggal saya dengan jenis lurus, hanya dengan menghapus dan mengetik ulang karakter yang sama. Itu Catatan Mac yang membuat stroke kunci yang sama menghasilkan kutipan tunggal melengkung.

double07robinhood
sumber
0

Saya tidak dapat menemukan apa masalahnya untuk waktu yang lama tetapi kemudian saya menyadari bahwa saya telah menyalin garis "UTC-12: 00" dari web dan tanda hubung / tanda hubung dalam hal ini yang menyebabkan masalah. Saya hanya menulis ini "-" lagi dan masalahnya teratasi.

Jadi, terkadang salin baris yang disisipkan juga memberikan kesalahan. Dalam kasus seperti itu, cukup tulis ulang kode yang disalin dan berhasil. Saat menulis ulang, sepertinya tidak ada yang berubah tetapi kesalahan akan hilang.

Sugandha Jain
sumber
-1

Ketika saya memiliki masalah serupa saat membaca file teks yang saya gunakan ...

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