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.