Python“ SyntaxError: อักขระที่ไม่ใช่ ASCII '\ xe2' ในไฟล์”


179

ฉันกำลังเขียนโค้ดไพ ธ อนและฉันได้รับข้อความแสดงข้อผิดพลาดเช่นเดียวกับในชื่อเรื่องจากการค้นหาสิ่งนี้เกี่ยวข้องกับชุดอักขระ

นี่คือบรรทัดที่ทำให้เกิดข้อผิดพลาด

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

ฉันไม่สามารถทราบได้ว่าตัวละครใดไม่ได้อยู่ในชุด ANSI ASCII? นอกจากนี้การค้นหา "\ xe2" ไม่ได้ให้ข้อมูลอีกต่อไปว่าเป็นตัวละครที่ปรากฏเป็นอย่างไร อักขระใดในบรรทัดนั้นที่ทำให้เกิดปัญหา

ฉันเคยเห็นการแก้ไขบางอย่างสำหรับปัญหานี้ แต่ฉันไม่แน่ใจว่าจะใช้อะไร ใครช่วยอธิบายว่าปัญหาคืออะไร (หลามไม่ได้แปลยูนิโค้ดเว้นแต่บอกให้ทำเช่นนั้น) และฉันจะล้างมันอย่างถูกต้องได้อย่างไร

แก้ไข: นี่คือบรรทัดทั้งหมดที่อยู่ใกล้กับข้อผิดพลาด

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
เพิ่ม # coding: utf-8 ที่ด้านบนของไฟล์
Mutant

2
ไม่มีปัญหาในสิ่งที่คุณโพสต์ ดูในบรรทัดใกล้เคียง
kindall

เพิ่มการแก้ไขทุกอย่างเห็นอะไรในบรรทัดเหล่านั้นหรือไม่
KDecker

3
คุณลองใช้คำแนะนำของ Mutant หรือไม่? คุณมี "อัญประกาศที่ชาญฉลาด" (ชนิดโค้งและ / หรือมีมุม) ที่ใดก็ได้ในไฟล์หรือไม่?
John Y

2
ตัวอย่างหนึ่งซึ่งอาจทำให้เกิดเป็น EN DASH ( - \xe2\x80\x93)
Martin Thoma

คำตอบ:


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
ขอบคุณสิ่งนี้ช่วยได้มาก! ยังไม่แน่ใจว่ากฎบัตรคืออะไร / คืออะไร ฉันลงเอยด้วยการขว้างโค้ดใน Notepad และบันทึกเป็น ASCII แล้วจึงวาง
KDecker

ฉันเผชิญกับสิ่งนี้เช่นกันซึ่งฉันคิดว่าเป็นเพราะปัญหาการคัดลอกวางซึ่งตัวละครปรากฏเป็นช่องว่างในตัวแก้ไข (vim)
Samveen

มันอาจจำเป็นที่จะต้องให้ไพ ธ อนรู้ว่าตัวอักษรดังกล่าวมีอยู่ด้วยเหตุผลไม่ใช่เพียงแค่ไบต์เร่ร่อน ดูคำตอบของ Chris Redford
Simplyharsh

7
ฉันมีปัญหาเดียวกันตัวละคร \ xe2 เป็นส่วนหนึ่งของเครื่องหมายขีดคั่น "-" (\ xe2 \ x80 \ x93) แต่ยาวกว่า ascii เล็กน้อย "-" นั่นเป็นเพราะฉันวางข้อความเป็นกลุ่ม แต่ไม่ได้สนใจยัติภังค์ที่ยาวนานกว่านี้อีก สำหรับเรื่องราวทั้งหมดฉันได้สร้างตัวละครนี้ด้วยเครื่องหมายยัติภังค์ "-" ในข้อความวิกิ (ใช้สิ่งทอ)
PlasmaBinturong

1
ของฉันอยู่ในเครื่องหมายวรรคตอน - ในฐานะO'Donnell
2490003

278

หากคุณกำลังพยายามใช้ UTF-8 อักขระหรือไม่สนใจว่าอยู่ในรหัสของคุณหรือไม่ให้เพิ่มบรรทัดนี้ที่ด้านบนของ.pyไฟล์

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

1
สำหรับฉันมันไม่ทำงาน ข้อผิดพลาดด้านล่างแสดงเสมอ SyntaxError: อักขระที่ไม่ใช่ ASCII '\ xe2' ในไฟล์ /home/aslam/projects/deva_26nov/mylibrary/email_constants.py ที่บรรทัด 393 แต่ไม่มีการเข้ารหัสที่ประกาศ ดูpython.org/peps/pep-0263.htmlเพื่อดูรายละเอียด
Aslam Khan

2
มีเหตุผลนี้ไม่ใช่คำตอบที่เลือกหรือไม่?
cph

@cph ฉันเขียนมัน 4 เดือนหลังจากคำถามที่ถูกถาม :)
คริส Redford

@cph เพราะในขณะนี้มีประโยชน์มากคำตอบที่เลือกตอบคำถามของ "อักขระใดไม่ได้อยู่ในชุด ANSI ASCII" ทั้งสองเป็นคำตอบที่ดีและคนแรกมักจะชนะในกรณีนั้น
Arthur Dent


27

\ xe2 เป็นตัวอักษร '-' ปรากฏในสำเนาบางส่วนและวางโดยใช้รูปลักษณ์ที่ต่างกัน '-' ที่ทำให้เกิดข้อผิดพลาดในการเข้ารหัส แทนที่ '-' (จากการคัดลอกวาง) ด้วยปุ่ม '-' ที่ถูกต้อง (จากแป้นคีย์บอร์ดของคุณ)


3
ขอบคุณมาก ! ในกรณีของฉันมันคือตัวละคร "'"
pietà

23

เปลี่ยนการเข้ารหัสอักขระไฟล์

ใส่บรรทัดด้านล่างบรรทัดด้านบนของรหัสของคุณเสมอ

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

10

ฉันมีข้อผิดพลาดเดียวกันขณะคัดลอกและวางความคิดเห็นจากเว็บ

สำหรับฉันมันเป็นคำพูดเดียว (') ในคำว่า

ฉันเพิ่งลบมันและพิมพ์ใหม่อีกครั้ง


ฉันมีข้อผิดพลาดเดียวกัน แต่ในขณะที่การทดสอบในพื้นที่มันก็ไม่ได้หยุดและทำงาน แต่เมื่อรันบนเซิร์ฟเวอร์มันทำให้เกิดข้อผิดพลาดในการเข้ารหัส มีการแทนที่ความคิดเห็นคำพูดเดียวกับรุ่น utf-8
shivgre

8

การเพิ่ม# coding = utf-8บรรทัดในบรรทัดแรกของไฟล์. py ของคุณจะแก้ไขปัญหาได้

โปรดอ่านเพิ่มเติมเกี่ยวกับปัญหาและการแก้ไขในลิงค์ด้านล่างในปัญหาของบทความนี้และการแก้ปัญหาได้อธิบายไว้อย่างสวยงาม: https://www.python.org/dev/peps/pep-0263/


4

ฉันได้รับข้อผิดพลาดนี้สำหรับตัวละครในความคิดเห็นของฉัน (จากการคัดลอก / วางเนื้อหาจากเว็บไปยังโปรแกรมแก้ไขเพื่อการจดบันทึก)

วิธีแก้ไขใน Text Wrangler:

  1. ไฮไลต์ข้อความ
  2. ไปที่เมนูข้อความ
  3. เลือก "แปลงเป็น ASCII"

2
ตัวเลือกถูกเปลี่ยนเป็น text-> zap gremlins ใน TextWrangler รุ่นที่ใหม่กว่า แต่มันใช้ได้กับฉัน :-)
TheMethod

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

หลังจากดูที่ traceback ฉันสามารถค้นหาคำพูดเดียวที่ใช้ในความคิดเห็นของฉัน


2

ถ้ามันช่วยใครก็ได้สำหรับฉันที่เกิดขึ้นเพราะฉันพยายามเรียกใช้งาน Django ใน python 3.4 ด้วยคำสั่ง python 2.7


ไม่ได้ใช้ Django แต่สิ่งนี้ยังช่วยฉันได้ ฉันเขียนสคริปต์โดยใช้ python 3 และลองเรียกใช้ด้วย python 2 ข้อผิดพลาดหายไปเมื่อฉันรันด้วยรุ่นที่ถูกต้อง ขอบคุณ!
JustBlossom

1

ฉันมีปัญหาตรงนี้เรียกใช้รหัส. simple ด้านล่าง:

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

รหัสของ DSM ด้านบนระบุสิ่งต่อไปนี้:

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

ดังนั้นปัญหาก็คือโปรแกรมแก้ไขข้อความของฉันใช้ SMART QUOTES ตามที่ John Y แนะนำ หลังจากเปลี่ยนการตั้งค่าตัวแก้ไขข้อความและเปิด / บันทึกไฟล์ใหม่ก็ใช้งานได้ดี


1

ฉันพยายามที่จะแยกวิเคราะห์ว่าแปลก windows apostraphe และหลังจากพยายามหลายสิ่งที่นี่เป็นข้อมูลรหัสที่ทำงาน

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)

คุณสามารถเห็นได้ชัดเจนมีบิตของความแตกต่างระหว่างทั้งสองยัติภังค์

ฉันคิดว่าเป็นเพราะการจัดรูปแบบที่แตกต่างกันที่ใช้โดยระบบปฏิบัติการที่แตกต่างกันหรืออาจเป็นเพียงซอฟต์แวร์ที่แตกต่างกัน


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 ของฉันเพื่อสร้างไฟล์ของฉัน นี่ทำให้คำพูดเดี่ยวของฉันเป็นประเภทโค้ง เพื่อแก้ไขฉันเปิดไฟล์ของฉันเป็นกลุ่มและแทนที่คำพูดเดี่ยวที่โค้งของฉันทั้งหมดด้วยแบบตรงเพียงแค่ลบและพิมพ์อักขระตัวเดียวกันซ้ำ มันเป็น Mac Notes ที่ทำให้จังหวะหลักที่เหมือนกันทำให้เกิดการอ้างถึงแบบโค้งเดียว


0

ฉันไม่พบสิ่งที่เป็นปัญหามานาน แต่หลังจากนั้นฉันก็รู้ว่าฉันได้คัดลอกบรรทัด "UTC-12: 00" จากเว็บและยัติภังค์ / ขีดกลางในสิ่งนี้ทำให้เกิดปัญหา ฉันเพิ่งเขียน "-" อีกครั้งและปัญหาได้รับการแก้ไข

ดังนั้นบางครั้งการคัดลอกบรรทัดที่วางก็มีข้อผิดพลาด ในกรณีเช่นนี้ให้เขียนโค้ดที่คัดลอกใหม่อีกครั้งและใช้งานได้ เมื่อเขียนใหม่ดูเหมือนว่าไม่มีอะไรเปลี่ยนแปลง แต่ข้อผิดพลาดจะหายไป


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.