Python SyntaxError: Ký tự không phải ASCII '\ xe2' trong tập tin


179

Tôi đang viết một số mã python và tôi nhận được thông báo lỗi như trong tiêu đề, từ việc tìm kiếm này phải làm với bộ ký tự.

Đây là dòng gây ra lỗi

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

Tôi không thể tìm ra nhân vật nào không có trong bộ ANSI ASCII? Hơn nữa, việc tìm kiếm "\ xe2" không cung cấp thêm thông tin về ký tự xuất hiện dưới dạng. Nhân vật nào trong dòng đó đang gây ra vấn đề?

Tôi cũng đã thấy một vài sửa chữa cho vấn đề này nhưng tôi không chắc nên sử dụng. Ai đó có thể làm rõ vấn đề là gì không (python không giải thích unicode trừ khi được yêu cầu làm như vậy?), Và làm thế nào để tôi làm rõ vấn đề này?

EDIT: Đây là tất cả các dòng gần lỗi

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
thêm # mã hóa: utf-8 trên đầu tệp.
Đột biến

2
Không có vấn đề trong những gì bạn đăng; nhìn vào các dòng gần đó.
loại

Đã thêm một loại chỉnh sửa, xem bất cứ điều gì trong những dòng đó?
KDecker

3
Bạn đã thử gợi ý của Mutant chưa? Bạn có "trích dẫn thông minh" (loại cong và / hoặc góc) ở bất cứ đâu trong tệp không?
John Y

2
Một ví dụ có thể gây ra nó là EN DASH ( - \xe2\x80\x93)
Martin Thoma

Câu trả lời:


145

Bạn đã có một byte đi lạc trôi nổi xung quanh. Bạn có thể tìm thấy nó bằng cách chạy

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

nơi bạn nên thay thế "x.py"bằng tên của chương trình của bạn. Bạn sẽ thấy số dòng và (các) dòng vi phạm. Ví dụ, sau khi chèn byte đó một cách tùy ý, tôi đã nhận được:

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

2
Cảm ơn điều này đã giúp rất nhiều! Vẫn không chắc chắn điều lệ là gì / đã. Cuối cùng tôi đã ném mã vào notepad và lưu thành ASCII, rồi dán.
KDecker

Tôi cũng phải đối mặt với điều này, điều mà tôi nghĩ là do một số vấn đề sao chép, trong đó nhân vật xuất hiện dưới dạng khoảng trắng trong trình chỉnh sửa (vim).
Samveen

Có thể cần phải có python biết rằng các ký tự như vậy ở đó vì một lý do chứ không chỉ là một byte đi lạc. Xem giải pháp trong câu trả lời của Chris Redford.
đơn giản là

7
Tôi gặp vấn đề tương tự, ký tự \ xe2 là một phần của dấu gạch nối "-" (\ xe2 \ x80 \ x93), nhưng dài hơn một chút so với ascii "-". Đó là bởi vì tôi đã dán văn bản vào vim, nhưng không chú ý đến dấu gạch nối dài hơn này. Để biết toàn bộ câu chuyện, tôi đã tạo ra nhân vật này với dấu gạch nối kép "-" trong văn bản wiki (sử dụng hàng dệt may)
PlasmaBinturong

1
Của tôi đã ở trong một dấu nháy đơn - như trongO'Donnell
user2490003

278

Nếu bạn chỉ đang cố gắng sử dụng các ký tự UTF-8 hoặc không quan tâm nếu chúng có trong mã của bạn, hãy thêm dòng này vào đầu .pytệp của bạn

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

1
Đối với tôi nó không hoạt động. Lỗi dưới hiển thị luôn. Cú pháp: Ký tự không phải mã ASCII '\ xe2' trong tệp /home/aslam/projects/deva_26nov/myl Library / emem_constants.py trên dòng 393, nhưng không khai báo mã hóa; xem python.org/peps/pep-0263.html để biết chi tiết
Aslam Khan

2
Có một lý do đây không phải là một câu trả lời được lựa chọn?
cph

@cph Tôi đã viết nó 4 tháng sau khi câu hỏi được hỏi :)
Chris Redford

@cph bởi vì, trong khi điều này rất hữu ích, câu trả lời được chọn trả lời câu hỏi "nhân vật nào không có trong bộ ANSI ASCII?" Cả hai đều là câu trả lời tốt mặc dù và câu đầu tiên thường thắng trong trường hợp đó.
Arthur Dent

39

Hoặc bạn chỉ có thể sử dụng đơn giản:

# coding: utf-8

ở đầu tập tin .py


27

\ xe2 là ký tự '-', nó xuất hiện trong một số bản sao và dán nó sử dụng một cái nhìn khác nhau '-' gây ra lỗi mã hóa. Thay thế '-' (từ sao chép dán) bằng '-' (từ nút bàn phím của bạn).


3
cảm ơn rất nhiều ! trong trường hợp của tôi, đó là ký tự "'"
pietà

23

Thay đổi mã hóa ký tự tệp,

đặt dòng dưới đây lên đầu mã của bạn luôn

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

10

Tôi đã có cùng một lỗi trong khi sao chép và dán nhận xét từ trang web

Đối với tôi đó là một trích dẫn (') trong từ

Tôi chỉ cần xóa nó và gõ lại.


Tôi đã có cùng một lỗi, nhưng trong khi thử nghiệm cục bộ, nó đã không bị hỏng và hoạt động. Nhưng khi chạy trên máy chủ, nó đã báo lỗi. Phải thay thế các bình luận trích dẫn đơn thành phiên bản utf-8.
shivgre

8

Thêm dòng # mã = ​​utf-8 vào dòng đầu tiên của tệp .py của bạn sẽ khắc phục sự cố.

Vui lòng đọc thêm về sự cố và cách khắc phục ở liên kết bên dưới, trong bài viết này, vấn đề và giải pháp của nó được mô tả rất hay: https://www.python.org/dev/peps/pep-0263/


4

Tôi đã gặp lỗi này đối với các ký tự trong nhận xét của mình (từ sao chép / dán nội dung từ web vào trình chỉnh sửa của tôi cho mục đích ghi chú).

Để giải quyết trong Text Wrangler:

  1. Đánh dấu văn bản
  2. Chuyển đến menu Văn bản
  3. Chọn "Chuyển đổi sang ASCII"

2
Tùy chọn đã được thay đổi thành text-> zap gremlins, trong các phiên bản sau của TextWrangler nhưng nó đã hoạt động với tôi :-)
TheMethod 11/215

4

Dựa trên PEP 0263 - Xác định mã hóa mã nguồn 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> :

Tuy nhiên, nó đã làm việc từ bình luận đầu tiên cho câu hỏi, câu trả lời có chứa lời giải thích. cảm ơn
WebComer

3

Tôi gặp vấn đề tương tự và chỉ thêm vấn đề này vào đầu tệp của tôi (trong Python 3 tôi không gặp vấn đề gì nhưng làm trong Python 2

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

2

Sau khoảng nửa giờ xem qua tràn ngăn xếp, tôi nhận ra rằng nếu việc sử dụng một trích dẫn "'" trong một nhận xét sẽ thông qua lỗi:

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

Sau khi nhìn vào dấu vết, tôi đã có thể xác định vị trí trích dẫn được sử dụng trong nhận xét của mình.


2

Nếu nó giúp được bất cứ ai, thì đối với tôi điều đó đã xảy ra bởi vì tôi đang cố chạy một triển khai Django trong python 3.4 bằng lệnh python 2.7 của tôi


Không sử dụng Django, nhưng điều này vẫn giúp tôi. Tôi đã viết kịch bản bằng python 3 và thử chạy nó với python 2. Lỗi đã biến mất khi tôi chạy nó với phiên bản phù hợp. Cảm ơn!
JustBlieo

1

Tôi đã có vấn đề chính xác này khi chạy mã .py đơn giản dưới đây:

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

Mã DSM ở trên cung cấp các thông tin sau:

1 'in \ xe2 \ x80 \ x98version là \ xe2 \ x80 \ x99, sys.version'

Vì vậy, vấn đề là trình soạn thảo văn bản của tôi đã sử dụng SMART QUOTES, như John Y đề xuất. Sau khi thay đổi cài đặt trình soạn thảo văn bản và mở lại / lưu tệp, nó hoạt động tốt.


1

Tôi đang cố gắng phân tích cú pháp cửa sổ kỳ lạ đó và sau khi thử một vài thứ ở đây là đoạn mã hoạt động.

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

Tôi đã có cùng một vấn đề nhưng đó là vì tôi đã sao chép và dán chuỗi như vậy. Sau này khi tôi gõ chuỗi thủ công thì đó là lỗi biến mất.

Tôi đã có lỗi do các -dấu hiệu. Khi tôi thay thế nó bằng cách nhập thủ công, một -lỗi đã được giải quyết.

Chuỗi sao chép 10 + 3 * 5/(16 − 4)

Nhập chuỗi thủ công 10 + 3 * 5/(16 - 4)

bạn có thể thấy rõ có một chút khác biệt giữa cả hai dấu gạch nối .

Tôi nghĩ đó là do định dạng khác nhau được sử dụng bởi các hệ điều hành khác nhau hoặc có thể chỉ là phần mềm khác nhau.


0

Đối với tôi, vấn đề đã gây ra do "'" biểu tượng đó trong dấu ngoặc kép. Vì tôi đã sao chép mã từ tệp pdf nên nó đã gây ra lỗi đó. Tôi chỉ thay thế "'" bằng "" "này.


0

Nếu bạn muốn phát hiện ra ký tự nào gây ra điều này, chỉ cần gán biến có vấn đề cho một chuỗi và in nó trong bảng điều khiển iPython.

Trong trường hợp của tôi

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

đối với tôi, vấn đề xảy ra là do nhập mã của tôi vào Mac Notes và sau đó sao chép nó từ Mac Notes và dán vào phiên vim của tôi để tạo tệp của tôi. Điều này làm cho trích dẫn duy nhất của tôi loại cong. để sửa nó, tôi đã mở tập tin của mình trong vim và thay thế tất cả các trích dẫn đơn cong của tôi bằng loại thẳng, chỉ bằng cách xóa và gõ lại cùng một ký tự. Đó là Mac Notes đã thực hiện cùng một hành trình phím tạo ra trích dẫn đơn cong.


0

Tôi không thể tìm thấy vấn đề gì lâu dài nhưng sau đó tôi nhận ra rằng tôi đã sao chép một dòng "UTC-12: 00" từ web và dấu gạch nối / dấu gạch ngang trong điều này đã gây ra sự cố. Tôi chỉ viết "-" một lần nữa và vấn đề đã được giải quyết.

Vì vậy, đôi khi các dòng sao chép dán cũng cho lỗi. Trong trường hợp như vậy, chỉ cần viết lại mã đã dán sao chép và nó hoạt động. Khi viết lại, có vẻ như không có gì thay đổi nhưng lỗi sẽ không còn nữa.


-1

Khi tôi gặp vấn đề tương tự khi đọc tệp văn bản, tôi sử dụng ...

f = open('file','rt', errors='ignore')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.