“ สำหรับสายเข้า…” ผลลัพธ์เป็น UnicodeDecodeError: ตัวแปลงสัญญาณ 'utf-8' ไม่สามารถถอดรหัสไบต์


215

นี่คือรหัสของฉัน

for line in open('u.item'):
#read each line

เมื่อใดก็ตามที่ฉันเรียกใช้รหัสนี้จะให้ข้อผิดพลาดต่อไปนี้:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte

ฉันพยายามที่จะแก้ปัญหานี้และเพิ่มพารามิเตอร์พิเศษใน open () รหัสดูเหมือน;

for line in open('u.item', encoding='utf-8'):
#read each line

แต่อีกครั้งมันให้ข้อผิดพลาดเดียวกัน ฉันควรทำยังไงดี! กรุณาช่วย.


3
ข้อมูลที่เข้ารหัสไม่ดีฉันจะถือว่า
Andreas Jung

9
หรือไม่ใช่ข้อมูล UTF-8
Mark Tolonen


เราพบข้อผิดพลาดนี้กับ msgpack เมื่อใช้ python 3 แทน python 2.7 สำหรับเราหลักสูตรของการกระทำคือการทำงานกับ python 2.7
Jesse W. Collins

คำตอบ:


404

ตามคำแนะนำของ Mark Ransom ฉันพบการเข้ารหัสที่ถูกต้องสำหรับปัญหานั้น การเข้ารหัสคือ "ISO-8859-1" ดังนั้นการแทนที่open("u.item", encoding="utf-8")ด้วยopen('u.item', encoding = "ISO-8859-1")จะช่วยแก้ปัญหา


8
ชัดเจนดีกว่าโดยนัย (PEP 20)
Ioannis Filippidis

6
เคล็ดลับคือ ISO-8859-1 หรือ Latin_1 เป็นชุดอักขระ 8 บิตดังนั้นขยะทั้งหมดมีค่าที่ถูกต้อง อาจจะไม่เป็นประโยชน์ แต่ถ้าคุณต้องการที่จะไม่สนใจ!
Kjeld Flarup

1
ฉันมีปัญหาเดียวกันกับ UnicodeDecodeError: ตัวแปลงสัญญาณ 'utf-8' ไม่สามารถถอดรหัสไบต์ 0xd0 ในตำแหน่ง 32: ไบต์ต่อเนื่องที่ไม่ถูกต้อง ฉันใช้ python 3.6.5 เพื่อติดตั้ง aws cli และเมื่อฉันลอง aws - รุ่นมันล้มเหลวด้วยข้อผิดพลาดนี้ ดังนั้นฉันต้องแก้ไข /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py และเปลี่ยนรหัสเป็นdef อ่าน
ЕвгенийКоптюбенко

3
มีวิธีตรวจจับการเข้ารหัสโดยอัตโนมัติหรือไม่?
OrangeSherbet

5
@OrangeSherbet chardetผมดำเนินการตรวจสอบการใช้ นี่คือหนึ่งซับ (หลัง):import chardet chardet.detect(open(in_file, 'rb').read())['encoding']ดูรายละเอียดคำตอบนี้ได้ที่: stackoverflow.com/a/3323810/615422
VertigoRay

51

ได้ผลสำหรับฉันแล้ว ISO 8859-1 จะประหยัดได้มากฮ่าฮ่าฮ่าส่วนใหญ่ถ้าใช้ Speech Recognition API

ตัวอย่าง:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

4
คุณอาจถูกต้องว่า OP กำลังอ่าน ISO 8859-1 ซึ่งสามารถอนุมานได้จาก 0xe9 (é) ในข้อความแสดงข้อผิดพลาด แต่คุณควรอธิบายว่าเพราะเหตุใดโซลูชันของคุณจึงทำงาน การอ้างอิงถึง API การจดจำเสียงไม่ได้ช่วยอะไร
RolfBly

5
อะไรคือเซมิโคลอน?
ขาขวา

29

ไฟล์ของคุณไม่มีข้อมูลที่เข้ารหัส utf-8 จริง ๆ แล้วมีการเข้ารหัสอื่น ๆ คิดออกว่าการเข้ารหัสคืออะไรและใช้ในการopenโทร

ใน Windows 1252 การเข้ารหัสเช่นจะเป็นตัวอักษร0xe9é


4
ดังนั้นฉันจะรู้ได้อย่างไรว่าการเข้ารหัสคืออะไร! ฉันใช้ linux
SujitS

4
ไม่มีวิธีการทำเช่นนั้นที่ใช้งานได้เสมอ แต่ดูคำตอบสำหรับคำถามนี้: stackoverflow.com/questions/436220/…
RemcoGerlich

20

ลองสิ่งนี้เพื่ออ่านโดยใช้แพนด้า

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')

ไม่แน่ใจว่าทำไมคุณถึงแนะนำแพนด้า วิธีการแก้ปัญหาคือการตั้งค่าการเข้ารหัสที่ถูกต้องซึ่งคุณได้โอกาสที่นี่
Alastair McCormack

12

หากคุณใช้Python 2วิธีแก้ไขปัญหาต่อไปนี้:

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

เนื่องจากencodingพารามิเตอร์ใช้ไม่ได้open()คุณจะได้รับข้อผิดพลาดต่อไปนี้:

TypeError: 'encoding' เป็นอาร์กิวเมนต์คำหลักที่ไม่ถูกต้องสำหรับฟังก์ชั่นนี้

1
แต่นี่เป็นเวอร์ชั่น 3
SujitS

1
ใช่ฉันรู้. ฉันคิดว่ามันอาจจะเป็นประโยชน์สำหรับผู้ใช้Python 2
Jeril

ทำงานให้ฉันใน Python3 ด้วย
fenkerbb

2
ในกรณีที่คุณต้องการสิ่งที่ง่ายต่อการจดจำ, 'ISO-8859-1'นอกจากนี้ยังเป็นที่รู้จักกันหรือ'latin-1' 'latin1'
Max Candocia

9

คุณสามารถแก้ไขปัญหาด้วย:

for line in open(your_file_path, 'rb'):

'rb' กำลังอ่านไฟล์ในโหมดไบนารี อ่านเพิ่มเติมที่นี่ หวังว่านี่จะช่วยได้!



2

หากมีคนมองหาสิ่งนี้เป็นตัวอย่างสำหรับการแปลงไฟล์ CSV ใน Python 3:

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

บางครั้งเมื่อopen(filepath)ซึ่งfilepathไม่ใช่ไฟล์จริงจะได้รับข้อผิดพลาดเดียวกันดังนั้นก่อนอื่นให้ตรวจสอบว่าไฟล์ที่คุณพยายามเปิดมีอยู่:

import os
assert os.path.isfile(filepath)

หวังว่าจะช่วยได้


1

คุณสามารถลองด้วยวิธีนี้:

open('u.item', encoding='utf8', errors='ignore')

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