Używam tego kodu, aby uzyskać standardowe wyjście z zewnętrznego programu:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Metoda Communication () zwraca tablicę bajtów:
>>> 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'
Chciałbym jednak pracować z danymi wyjściowymi jako normalnym ciągiem Python. Żebym mógł wydrukować to w ten sposób:
>>> 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
Myślałem, że po to jest metoda binascii.b2a_qp () , ale kiedy spróbowałem, znów otrzymałem tę samą tablicę bajtów:
>>> 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'
Jak przekonwertować wartość bajtów z powrotem na ciąg? Mam na myśli używanie „baterii” zamiast robienia tego ręcznie. I chciałbym, żeby było dobrze w Pythonie 3.
str(text_bytes)
nie można określić kodowania. W zależności od tego, co jest w text_bytes, text_bytes.decode('cp1250
) `może spowodować bardzo inny ciąg znaków do text_bytes.decode('utf-8')
.
str
funkcja nie przekształca się już w prawdziwy ciąg. Z jakiegoś powodu MUSIMY wyraźnie powiedzieć kodowanie. Jestem leniwy, by przeczytać, dlaczego. Po prostu przekonwertuj go utf-8
i sprawdź, czy Twój kod działa. np.var = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
działa zgodnie z oczekiwaniami w Pythonie 3. Chociaż unicode_text = bytestring.decode(character_encoding)
bardziej preferowane jest unikanie pomyłek z tym, str(bytes_obj)
że tworzy reprezentację tekstową bytes_obj
zamiast dekodowania jej do tekstu: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
istr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
działa To wydaje mi się dziwne.