hatası UnicodeDecodeError: 'utf-8' codec bileşeni 0 konumunda bayt 0xff kodunun kodunu çözemiyor: geçersiz başlangıç ​​baytı


164

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

Yukarıdaki sitede "process.py" derlenirken bir hata oluştu.

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

Geri izleme (en son son arama):

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

Hatanın nedeni nedir? Python'un sürümü 3.5.2'dir.

Yanıtlar:


196

Python, bir bayt dizisini ( bytesutf-8 kodlu dize olduğu varsayıldığı) bir unicode dizeye ( str) dönüştürmeye çalışır. Bu süreç elbette utf-8 kurallarına göre bir kod çözmedir. Bunu denediğinde, utf-8 kodlu dizelerde (yani 0 konumunda bu 0xff) izin verilmeyen bir bayt dizisiyle karşılaşır.

Bakabileceğimiz herhangi bir kod sağlamadığınız için, sadece geri kalanı tahmin edebiliriz.

Yığın izlemesinden, tetikleyici eylemin bir dosyadan ( contents = open(path).read()) okuma olduğunu varsayabiliriz . Bunu böyle bir şekilde yeniden kodlamayı öneriyorum:

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

Yani bmodunda belirteci open()dosya ikili olarak muameleye tabi tutulacaktır devletler, bu nedenle contentsbir kalacaktır bytes. Bu şekilde kod çözme girişimi gerçekleşmeyecektir.


"ValueError: mod dizesi" br "değil," r "," w "," a "veya" U "'dan biri ile başlamalıdır.
— Unnikrishnan

3
@Unnikrishnan Tamam, o zaman kullan rb(Siparişin önemli olmadığını düşündüm, ama en azından bazı sistemlerde / versiyonlarda olduğu anlaşılıyor). Cevabımı buna göre değiştirdim.
— Alfe

58
byte 0xff in position 0ayrıca dosyanın UTF-16 olarak kodlandığı anlamına gelebilir, with open(path, encoding='utf-16') as f:bunun yerine bunu yapabilirsiniz
— Nikolai R Kristiansen

Peki 0xffpozisyonda hiç karakter yoksa 0? Ve UTF-8kodlanmış.
— Iulian Onofrei

Saf bir '\xFF'karakter UTF-8 olarak kodlanacaktır '\xC3\xBF'. UTF-8, set MSB ile tüm karakterleri iki karakter kullanarak kodlar. (Kabuktaki çıktıya bakın printf "\xff" | iconv -f latin1 -t utf-8 | xxd.) '\xFF'UTF-8 kodlu dizenin başlangıcındaki bir sözcük , bir kodlama hatasıdır (UTF-8 açısından bir sözdizimi hatası olarak adlandırılabilir).
— Alfe

83

Bu çözümü kullanarak karakterleri çıkarır (yok sayar) ve dizeyi onlarsız döndürür. Bunu sadece ihtiyaçlarınızı dönüştürmemek için kullanın.

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

Kullanma errors='ignore' Bazı karakterleri kaybedeceksiniz. ancak sizin soket sunucuma bağlanan istemcilerin kötü biçimlendirmesi ve programlamasından kaynaklanan ekstra karakterler gibi gözükmüyorsa. Sonra kolay bir doğrudan çözüm. referans


6
Decode () için de çalışır: contents = contents.decode('utf-8', 'ignore')Kaynak: docs.python.org/3/howto/unicode.html#the-string-type
— naaman

2
En iyi cevap olmalı
— Statham

benim kullanım durumunda en iyi çözüm :)
— maestromusica

"Bazı karakterleri kaybet" dediğinde, hatalı dosyanın okunmayacağı anlamına mı geliyor? veya o dosyanın tüm içeriğinin okunmayacağını mı?
— msoutopico

@msoutopico Hataları yok saydığından, sorunlara neden olan bazı kodlamalar okunmaz. Ancak, okurken atlanan hiçbir içeriğe rastlamadım. Temelde ekolojik sorunlar göz ardı edilir.
— Nitish Kumar Pal

23

Buna benzer bir sorun vardı, çözmek için UTF-16 kullanarak sona erdi. kodum aşağıda.

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

bu, dosya içeriğini içe aktarma olarak alır, ancak kodu UTF biçiminde döndürür. oradan kodlar çözülecek ve çizgilerle ayrılacaktır.


10
Python 3'te kodlama parametresini kullanarak bunu basitleştirebilirsinizwith open(path, encoding='utf-16') as f
— Nikolai R Kristiansen

@NikolaiRKristiansen Metodunuzu kullanmayı denedim ama olarak bir hata aldım TypeError: an integer is required (got type str). Neden? Her iki dosya da ikiliktir ve olarak okunur rb.
— Bogota

1
@Bogota encodingParam yalnızca metin okurken anlamlıdır. Mod argümanından "b" yi bırakın ve tekrar deneyin. Dokümanlar'da daha fazlasını okuyun: docs.python.org/3/library/functions.html#open
— Nikolai R Kristiansen


15

Aynı hatayı çekerken bu iş parçacığına rastladım, onaylayabileceğim bazı araştırmalar yaptıktan sonra, UTF-8 dosyasını UTF-8 ile deşifre etmeye çalıştığınızda oluşan bir hata bu.

UTF-16 ile ilk karakter (UTF-16'da 2 bayt) , bir kod çözme ipucu olarak kullanılan ve kod çözülmüş dizede bir karakter olarak görünmeyen bir Byte Order Markadır (BOM) . Bu, ilk baytın FE veya FF ve ikincisi diğeri olacağı anlamına gelir.

Gerçek cevabı öğrendikten sonra yoğun bir şekilde düzenlendi


Bu 2 saat baş ağrısı sona erdi! Dosyayı f: olarak open ('dosyaadı', 'r') ile açtıktan sonra içeriğini yazdırdığınızda yanlış olan UTF-8 gösterilir.
— nulldroid


3

Mac kullanıyorsanız Gizli bir dosya olup olmadığını kontrol edin, .DS_Store. Dosyayı kaldırdıktan sonra programım çalıştı.


1

Okunacak dosyanın yolunu kontrol edin. Ben yol adını mevcut çalışma dizinine değiştirene kadar kodum bana hata vermeye devam etti. Hata:

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

1

bir seri bağlantı noktasından veri alıyorsanız, doğru baud hızını (ve diğer yapılandırmaları) kullandığınızdan emin olun: ( utf-8 ) kullanarak kod çözme ancak yanlış yapılandırma aynı hatayı oluşturur

UnicodeDecodeError: 'utf-8' codec bileşeni 0 konumunda bayt 0xff kodunun kodunu çözemiyor: geçersiz başlangıç ​​baytı

Linux kullanımında seri port yapılandırmanızı kontrol etmek için: stty -F /dev/ttyUSBX -a


1

Basitçe, dosyayı okumak için yanlış kodlamayı seçtiği anlamına gelir.

Mac'te file -I file.txtdoğru kodlamayı bulmak için kullanın . Linux'ta kullanın file -i file.txt.


0

Benzer bir sorun yaşadım.

Çözen:

import io

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

Ancak başka bir sorunum daha vardı. Bazı html dosyaları (benim durumumda) utf-8 değildi, bu yüzden benzer bir hata aldım. Bu html dosyalarını hariç tuttuğumda, her şey sorunsuz çalıştı.

Bu nedenle, kodu düzeltmek dışında, okuduğunuz dosyaları da kontrol edin, belki de orada bir uyumsuzluk var.


0

Linux'tan oluşturulan bir dosyayı işlerken aynı sorunu yaşıyorum. Soru işaretleri içeren dosyalarla ilgili olduğu ortaya çıktı.


-5

Mümkünse, dosyayı bir metin düzenleyicide açın ve kodlamayı UTF-8 olarak değiştirmeyi deneyin. Aksi takdirde OS düzeyinde programlı olarak yapın.


-5

Benzer bir sorunum var. Ben tensorflow / models / objektif_detection bir örnek çalıştırmak çalışın ve aynı mesajı bir araya geldi. Python3'ü Python2 olarak değiştirmeye çalışın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.