Nasıl 'ikili dize' Python3 normal dize dönüştürmek için?


258

Örneğin, böyle bir dize var (dönüş değeri subprocess.check_output):

>>> b'a string'
b'a string'

Ne yaparsam yap, her zaman b'dizeden önce can sıkıcı ile yazdırılır :

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

Herkes normal bir dize olarak kullanmak veya normal bir dize dönüştürmek hakkında herhangi bir fikri var mı?



@HanfeiSun " ikili dize " olarak adlandırdığınız şey bir bayt nesnesidir ( standart kütüphanedeki bayt nesnesi hakkındaki bilgilere bakın )
loved.by.Jesus

Yanıtlar:


357

Kodunu çöz.

>>> b'a string'.decode('ascii')
'a string'

Dizeden bayt almak için kodlayın.

>>> 'a string'.encode('ascii')
b'a string'

27
@lyomi, kullandım asciiçünkü verilen dize ascii harflerle yapıldı. Kodlama ise kodlama belirtmek gerekmez utf-8(uygun Python 3.x varsayılan str.encode, bytes.decodedoc-string)
falsetru

2
@lyomi 2016'da (ve neredeyse sonu) insanlar hala ascii kullanıyor. Birçok 'eski' ürün ve sistem (spesifikasyonlar dahil) vardır, ancak unicode veya başka bir şey denemek ve birden fazla baytı 'birleştirmek' istemediğiniz bir 'ikili dize' yaratmanızın birçok nedeni de vardır. tek bir karakter. DNS istekleri vb. Gibi ikili veriler içermek için genellikle 'dizeleri' kullanırız
Jmons

Cevabı tamamlamak için aşağıdakileri eklemenizi öneririm. Çoğu zaman işletim sistemimizden, konsol çıkışı gibi baytları deşifre etmemiz gerekir, bunu yapmanın en pythonic yolu import localeve sonra os_encoding = locale.getpreferredencoding(). Bu şekilde, kullanarak kodunu çözebilirizmy_b_string.decode(os_encoding)
aturegano

2
@aturegano, bu tek seçenek değil. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. IMHO, bu otomatik kodlama algılamasını kullanmak sorunu çözebilir çünkü alt program (OP alt süreci kullanır) kodlamayı (veya sabit kodlanmış) belirlemek için başka bir yolla yazılabilir. Yine de geri bildiriminiz için teşekkürler.
falsetru

@falsetru sys.getfilesystemencoding()Unicode dosya adları ile bayt dosya adları arasında dönüştürme yapmak için kullanılan kodlamanın adını döndüren ve kullandığınız işletim sistemine büyük ölçüde bağlı olan not. AFAIK, bu işlev sistemin tercih edilen gösterimine dönüştürmek için kullanılır. Bu, yukarıda belirtilen locale.getpreferredencoding()işlev kullanılarak elde edilebilen konsol tarafından kullanılan
kodlamayı çıkarmayacağı


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.