Bir Python 3 bayt dizgi değişkenini normal bir dizeye nasıl dönüştürebilirim?


116

XML e-posta ekinde okudum

bytes_string=part.get_payload(decode=False)

Değişken adımın da önerdiği gibi yük, bir bayt dizesi olarak gelir.

Bu dizeyi işleyebileceğim kullanılabilir bir dizeye dönüştürmek için önerilen Python 3 yaklaşımını kullanmaya çalışıyorum.

Örnek şunları göstermektedir:

str(b'abc','utf-8')

b(Bayt) anahtar kelime bağımsız değişkenini değişkenime nasıl uygulayabilirim bytes_stringve önerilen yaklaşımı nasıl kullanabilirim?

Denediğim yol işe yaramıyor:

str(bbytes_string, 'utf-8')

Yanıtlar:


210

Son satırda neredeyse haklıydın. İstediğiniz

str(bytes_string, 'utf-8')

türüne için bytes_stringIS bytes, türü ile aynı b'abc'.


6
str(bytes_string, 'utf-8', 'ignore')Üçüncü parametre geçilerek hatalar göz ardı edilebilir.
Shubhamoy

2
Bu, pylang'ın cevabına (geçersiz girdi işleyen adresler) bir yorum olmalı gibi görünüyor . Eğer (buna inanıyorsanız) yanlış bir şey yoksa bytes_string, neden hataları görmezden gelmek isteyesiniz?
Toby Speight

3
Yaklaşımınızla ilgili şu hatayı alıyorum: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteaşağıdaki bayt dizesi için b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper

Peki @alper, bu geçerli bir UTF-8 dizesi değil, peki ne bekliyordun?
Toby Speight

Çözüm için teşekkürler
Ajay Kumar

49

Kodladığı metni almak için decode()bir bytesörnek çağırın .

str = bytes.decode()

5
UnicodeDecodeError: 'utf-8' codec bileşeni, 230 konumundaki 0xf6 baytının kodunu çözemiyor: geçersiz başlangıç ​​baytı
Juha Untinen

3
@JuhaUntinen kodlamanız muhtemelen utf-8 değil.
tommy.carstensen

4
UTF8 olmayan karakterler diziden nasıl filtrelenir (atlanır)?
Dr Failov

9

GÜNCELLENMİŞ:

HİÇBİR ŞEY OLMAMASI bve ilk ve sonunda alıntılar

bytesGarip durumlarda bile görüldüğü gibi dizelere dönüştürme .

Kodunuzda kodlanacak tanınmayan karakterler olabileceğinden, 'utf-8'herhangi bir ek parametre olmadan sadece str kullanmak daha iyidir:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

eklersen 'utf-8'Bu belirli baytlara parametre , hata almanız gerekir.

PYTHON 3 standardının dediği gibi, textartık endişesiz utf-8'de olacaktır.


sonuç "b '\\ x02 - \\ xdfI #)" "muhtemelen onun istediği şey değil
Glen Thompson

@GlenThompson bu, meydana gelebilecek istenmeyen koşullara sadece bir örnektir. Bu özel metni bilinçli olarak kullanıyorum. Metinde bilk olarak bir tane olduğunu kastediyorsanız , cevabı güncelledim
Seyfi 19'17

çok teşekkürler, karakterleri kodlamadan ve kaybetmeden ansi karakterine sahip bir dizenin b '' karakterini kaldırmanın bir yolunu arıyorum, python'da yeniyim ve bir diziyi baştan azaltabileceğimi bilmiyorum ve dizinler kullanmaya başlıyor: O
Diego Fernando Murillo Valenci

@DiegoFernandoMurilloValenci, hoş geldiniz. Yardımcı olabildiğime sevindim.
Seyfi

6

UTF8 olmayan karakterler diziden nasıl filtrelenir (atlanır)?

Bu yorumu @ uname01'in gönderisinde ve OP'de ele almak için hataları göz ardı edin:

kod

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

ayrıntılar

Gönderen dokümanlar , burada aynı kullanarak daha fazla örneklerdir errorsparametreyi:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

Hatalar argümanı, girdi dizesi kodlamanın kurallarına göre dönüştürülemediğinde verilecek yanıtı belirtir. Bu bağımsız değişken için yasal değerler şunlardır: 'strict'(bir UnicodeDecodeErroristisna oluşturun), 'replace'(kullanın U+FFFD, REPLACEMENT CHARACTER) veya 'ignore'(yalnızca karakteri Unicode sonucunun dışında bırakı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.