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.
1923
3
Bir dize üretmek için bayt nesnesinin kodunu çözmeniz gerekir:
Bayt dizesinin kodunu çözmeniz ve bir karakter (Unicode) dizesine dönüştürmeniz gerekir.
Python 2'de
veya
Python 3 Üzerine
veya
Bence bunu gerçekten istiyorsun:
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).