Baytları dizeye dönüştürme

Bu kodu harici bir programdan standart çıktı almak için kullanıyorum:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

communicate() yöntemi bir bayt dizisi döndürür:

>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Ancak, çıktı ile normal bir Python dizesi olarak çalışmak istiyorum. Böylece şu şekilde yazdırabilirim:

>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

binascii.b2a_qp()]1 yönteminin bunun için olduğunu düşündüm, ancak denediğimde yine aynı bayt dizisini aldım:

>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Bayt değerini tekrar dizeye nasıl dönüştürebilirim? Yani, elle yapmak yerine "batteries" kullanarak. Ve bunun Python 3 ile uyumlu olmasını istiyorum.

Çözüm

Bir dize üretmek için bayt nesnesinin kodunu çözmeniz gerekir:

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'
Yorumlar (18)

Bayt dizesinin kodunu çözmeniz ve bir karakter (Unicode) dizesine dönüştürmeniz gerekir.

Python 2'de

encoding = 'utf-8'
'hello'.decode(encoding)

veya

unicode('hello', encoding)

Python 3 Üzerine

encoding = 'utf-8'
b'hello'.decode(encoding)

veya

str(b'hello', encoding)
Yorumlar (0)

Bence bunu gerçekten istiyorsun:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')

Aaron'un cevabı doğruydu, ancak hangi kodlamayı kullanacağınızı bilmeniz gerekir. Ve Windows'un 'windows-1252' kullandığına inanıyorum. Bu sadece içeriğinizde bazı olağandışı (ASCII olmayan) karakterler varsa önemli olacaktır, ancak o zaman bir fark yaratacaktır.

Bu arada, Python'un ikili ve metin verileri için iki farklı tür kullanmaya geçmesinin nedeni önemli olmasıdır: siz söylemediğiniz sürece kodlamayı bilmediği için bunlar arasında sihirli bir şekilde dönüşüm yapamaz! Bunu bilmenin tek yolu Windows belgelerini okumaktır (ya da buradan okuyabilirsiniz).

Yorumlar (2)