ข้อผิดพลาด UnicodeDecodeError: ตัวแปลงสัญญาณ 'utf-8' ไม่สามารถถอดรหัสไบต์ 0xff ในตำแหน่ง 0: ไบต์เริ่มต้นที่ไม่ถูกต้อง


163

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

เกิดข้อผิดพลาดเมื่อรวบรวม "process.py" ในเว็บไซต์ด้านบน

 python tools/process.py --input_dir data --            operation resize --outp
ut_dir data2/resize
data/0.jpg -> data2/resize/0.png

Traceback (การโทรล่าสุดครั้งล่าสุด):

File "tools/process.py", line 235, in <module>
  main()
File "tools/process.py", line 167, in main
  src = load(src_path)
File "tools/process.py", line 113, in load
  contents = open(path).read()
      File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
  (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode     byte 0xff in position 0: invalid start byte

สาเหตุของข้อผิดพลาดคืออะไร? เวอร์ชั่นของ Python คือ 3.5.2

คำตอบ:


194

Python พยายามแปลงไบต์ ( bytesซึ่งจะถือว่าเป็นสตริงที่เข้ารหัส utf-8) เป็นสตริง Unicode ( str) กระบวนการของหลักสูตรนี้เป็นการถอดรหัสตามกฎ utf-8 เมื่อพยายามทำเช่นนี้จะพบลำดับไบต์ที่ไม่ได้รับอนุญาตในสตริงที่เข้ารหัส utf-8 (เช่น 0xff นี้ที่ตำแหน่ง 0)

เนื่องจากคุณไม่ได้ให้รหัสใด ๆ ที่เราสามารถดูได้เราสามารถเดาได้เฉพาะส่วนที่เหลือเท่านั้น

จากการติดตามสแต็กเราสามารถสันนิษฐานได้ว่าการกระทำที่เรียกคือการอ่านจากไฟล์ ( contents = open(path).read()) ฉันขอเสนอให้บันทึกในรูปแบบดังนี้:

with open(path, 'rb') as f:
  contents = f.read()

ที่bในโหมดระบุในopen()สหรัฐฯว่าไฟล์จะถูกถือว่าเป็นไบนารีดังนั้นจะยังคงเป็นcontents bytesไม่มีความพยายามในการถอดรหัสเกิดขึ้นในลักษณะนี้


ฉันได้รับข้อผิดพลาด "ValueError: สตริงโหมดต้องเริ่มต้นด้วย 'r', 'w', 'a' หรือ 'U' ไม่ใช่ 'br'"
Unnikrishnan

3
@ Unnikrishnan ตกลงแล้วใช้rb(ฉันคิดว่าคำสั่งไม่มีความสำคัญ แต่ดูเหมือนว่าอย่างน้อยในบางระบบ / บางรุ่น) ฉันเปลี่ยนคำตอบของฉัน
Alfe

57
byte 0xff in position 0อาจหมายถึงไฟล์นั้นถูกเข้ารหัสใน UTF-16 จากนั้นคุณสามารถทำได้with open(path, encoding='utf-16') as f:แทน
Nikolai R Kristiansen

เกิดอะไรขึ้นถ้าไม่มี0xffตัวละครที่ตำแหน่งจริง0? และมันถูกUTF-8เข้ารหัส
Iulian Onofrei

'\xFF'อักขระบริสุทธิ์จะถูกเข้ารหัสเป็น UTF-8 '\xC3\xBF'ดังนี้ UTF-8 เข้ารหัสอักขระทั้งหมดด้วยชุด MSB โดยใช้อักขระสองตัว (ดูผลลัพธ์ของprintf "\xff" | iconv -f latin1 -t utf-8 | xxdในเชลล์) คำต่อคำ'\xFF'ในตอนต้นของสตริงที่เข้ารหัส UTF-8 เป็นข้อผิดพลาดในการเข้ารหัส (อาจเรียกว่าข้อผิดพลาดทางไวยากรณ์ในแง่ของ UTF-8)
Alfe

83

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

with open(path, encoding="utf8", errors='ignore') as f:

การใช้errors='ignore' คุณจะสูญเสียอักขระบางตัวไป แต่ถ้าคุณไม่สนใจพวกเขาพวกเขาดูเหมือนจะเป็นตัวละครพิเศษที่เกิดจากการจัดรูปแบบที่ไม่ดีและการเขียนโปรแกรมของลูกค้าที่เชื่อมต่อกับเซิร์ฟเวอร์ซ็อกเก็ตของฉัน จากนั้นมันเป็นทางออกที่ง่ายโดยตรง การอ้างอิง


6
ใช้งานได้สำหรับถอดรหัส () เช่นกัน: contents = contents.decode('utf-8', 'ignore')ที่มา: docs.python.org/3/howto/unicode.html#the-string-type
naaman

2
ควรเป็นคำตอบที่ดีที่สุด
Statham

ทางออกที่ดีที่สุดในกรณีการใช้งานของฉัน :)
38417

เมื่อคุณพูดว่า "เสียอักขระบางตัว" คุณหมายถึงไฟล์ที่มีข้อผิดพลาดจะไม่ถูกอ่านหรือไม่? หรือว่าจะไม่อ่านเนื้อหาทั้งหมดของไฟล์นั้น
msoutopico

@msoutopico เนื่องจากไม่สนใจข้อผิดพลาดดังนั้นการเข้ารหัสบางอย่างจะไม่สามารถอ่านได้ซึ่งเป็นสาเหตุของปัญหา แต่ไม่เคยเจอเนื้อหาใด ๆ ที่ข้ามไปขณะอ่าน ดังนั้นประเด็นเรื่องการเข้ารหัสจึงถูกมองข้าม
Nitish Kumar Pal

23

มีปัญหาคล้ายกันนี้สิ้นสุดลงโดยใช้ UTF-16 เพื่อถอดรหัส รหัสของฉันอยู่ด้านล่าง

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

สิ่งนี้จะนำเนื้อหาไฟล์เป็นการอิมพอร์ต แต่มันจะส่งคืนรหัสในรูปแบบ UTF จากนั้นมันจะถูกถอดรหัสและคั่นด้วยเส้น


10
ใน Python 3 คุณสามารถทำให้สิ่งนี้ง่ายขึ้นโดยใช้พารามิเตอร์การเข้ารหัสwith open(path, encoding='utf-16') as f
Nikolai R Kristiansen

@NikolaiRKristiansen ฉันพยายามใช้วิธีการของคุณ TypeError: an integer is required (got type str)แต่มีข้อผิดพลาดเป็น ทำไม? rbทั้งสองไฟล์ไบนารีและอ่านเป็น
โบโกตา

1
@Bogota encodingพารามิเตอร์มีเหตุผลเมื่ออ่านข้อความเท่านั้น ทำเครื่องหมาย 'b' จากอาร์กิวเมนต์โหมดแล้วลองอีกครั้ง อ่านเพิ่มเติมได้ในเอกสาร: docs.python.org/3/library/functions.html#open
Nikolai R Kristiansen

19

ใช้รูปแบบการเข้ารหัสISO-8859-1เพื่อแก้ไขปัญหา


1
ในที่สุดก็ถึงจุดนี้หลังจากลองการเข้ารหัสมากกว่า 10 รายการ!
Rexcirus

15

ฉันได้พบกับเธรดนี้เมื่อพบข้อผิดพลาดเดียวกันหลังจากทำการวิจัยบางอย่างที่ฉันสามารถยืนยันได้นี่เป็นข้อผิดพลาดที่เกิดขึ้นเมื่อคุณพยายามถอดรหัสไฟล์ UTF-16 ด้วย UTF-8

ด้วย UTF-16 อักขระตัวแรก (2 ไบต์ใน UTF-16) คือ Byte Order Mark (BOM)ซึ่งใช้เป็นคำแนะนำในการถอดรหัสและไม่ปรากฏเป็นอักขระในสตริงถอดรหัส ซึ่งหมายความว่าไบต์แรกจะเป็น FE หรือ FF และครั้งที่สองอย่างอื่น

แก้ไขอย่างหนักหลังจากที่ฉันพบคำตอบที่แท้จริง


มันทำให้ปวดหัว 2 ชั่วโมง! การเปิดไฟล์ด้วย open ('filename', 'r') เป็น f: จากนั้นการพิมพ์เนื้อหาจะแสดง UTF-8 ซึ่งผิด
nulldroid


3

หากคุณใช้ Mac ให้ตรวจสอบว่าคุณหาไฟล์ที่ซ่อนอยู่หรือไม่. DS_Store หลังจากลบไฟล์โปรแกรมของฉันทำงาน


1

ตรวจสอบเส้นทางของไฟล์ที่จะอ่าน รหัสของฉันเก็บไว้ในการให้ฉันข้อผิดพลาดจนกว่าฉันจะเปลี่ยนชื่อเส้นทางเพื่อนำเสนอไดเรกทอรีการทำงาน ข้อผิดพลาดคือ:

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

1

หากคุณได้รับข้อมูลจากพอร์ตอนุกรมตรวจสอบให้แน่ใจว่าคุณกำลังใช้ baudrate ที่ถูกต้อง (และconfig อื่น ๆ ): การถอดรหัสโดยใช้ ( utf-8 ) แต่การตั้งค่าผิดจะสร้างข้อผิดพลาดเดียวกัน

UnicodeDecodeError: ตัวแปลงสัญญาณ 'utf-8' ไม่สามารถถอดรหัสไบต์ 0xff ในตำแหน่ง 0: ไบต์เริ่มต้นที่ไม่ถูกต้อง

เพื่อตรวจสอบการตั้งค่าพอร์ตอนุกรมของคุณเกี่ยวกับการใช้งาน linux: stty -F /dev/ttyUSBX -a


1

หมายความว่าเลือกการเข้ารหัสที่ผิดเพื่ออ่านไฟล์

บน Mac ใช้file -I file.txtเพื่อค้นหาการเข้ารหัสที่ถูกต้อง บน Linux file -i file.txtใช้งาน


0

ฉันมีปัญหาเดียวกันเมื่อประมวลผลไฟล์ที่สร้างจาก Linux ปรากฎว่ามันเกี่ยวข้องกับไฟล์ที่มีเครื่องหมายคำถาม


-1

ฉันมีปัญหาที่คล้ายกัน

แก้ไขได้โดย:

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

อย่างไรก็ตามฉันมีปัญหาอื่น ไฟล์ html บางไฟล์ (ในกรณีของฉัน) ไม่ใช่ utf-8 ดังนั้นฉันจึงได้รับข้อผิดพลาดที่คล้ายกัน เมื่อฉันยกเว้นไฟล์ html เหล่านั้นทุกอย่างทำงานได้อย่างราบรื่น

ดังนั้นยกเว้นการแก้ไขรหัสให้ตรวจสอบไฟล์ที่คุณกำลังอ่านอยู่ด้วยอาจมีความเข้ากันไม่ได้แน่นอน


-4

หากเป็นไปได้ให้เปิดไฟล์ในโปรแกรมแก้ไขข้อความและลองเปลี่ยนการเข้ารหัสเป็น UTF-8 มิฉะนั้นให้เขียนโปรแกรมในระดับระบบปฏิบัติการ


-4

ฉันมีปัญหาที่คล้ายกัน ฉันพยายามเรียกใช้ตัวอย่างใน tensorflow / models / purpose_detection และพบข้อความเดียวกัน ลองเปลี่ยน Python3 เป็น Python2

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