我正在使用以下代码从外部程序获取标准输出:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
communication()方法返回一个字节数组:
>>> 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'
但是,我想将输出作为普通的Python字符串使用。这样我就可以像这样打印它:
>>> 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()方法的用途,但是当我尝试使用它时,我又得到了相同的字节数组:
>>> 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'
如何将字节值转换回字符串?我的意思是,使用“电池”而不是手动进行操作。我希望它与Python 3兼容。
str(text_bytes)
无法指定编码。取决于text_bytes中的内容,text_bytes.decode('cp1250
)`可能导致字符串与完全不同text_bytes.decode('utf-8')
。
str
函数不再转换为真实字符串。由于某种原因,我不得不明确地说出一种编码,我懒得通读它的原因。只需将其转换为utf-8
,看看您的代码是否有效。例如var = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
按预期工作有关Python 3.尽管unicode_text = bytestring.decode(character_encoding)
是更优选的,以避免与刚刚混乱str(bytes_obj)
产生一个文本表示为bytes_obj
而不是将其进行解码,以文本:str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
和str(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
?在我看来这很奇怪。