Käytän tätä koodia saadakseni vakiotulosteen ulkoisesta ohjelmasta:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Kommunikoi()-metodi palauttaa tavujoukon:
>>> 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'
Haluaisin kuitenkin käsitellä tulostetta normaalina Python-merkkijonona. Jotta voisin tulostaa sen näin:
>>> 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
Luulin, että binascii.b2a_qp()-metodi on sitä varten, mutta kun kokeilin sitä, sain taas saman tavujoukon:
>>> 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'
Miten muunnan tavuarvon takaisin merkkijonoksi? Tarkoitan, että käytän "pattereita" sen sijaan, että tekisin sen manuaalisesti. Ja haluaisin, että se olisi kunnossa Python 3:n kanssa.
Sinun on purettava tavuobjekti merkkijonon tuottamiseksi:
>>> 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'
Sinun on purettava tavujono ja muutettava se merkkijonoksi (Unicode).
Python 2:ssa
encoding = 'utf-8'
'hello'.decode(encoding)
tai
unicode('hello', encoding)
Python 3:lla
encoding = 'utf-8'
b'hello'.decode(encoding)
tai
str(b'hello', encoding)
Luulen, että sinä todella haluat tämän:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')
Aaron'n vastaus oli oikea, paitsi että sinun on tiedettävä mitä koodausta käyttää. Ja uskon, että Windows käyttää 'windows-1252'. Sillä on merkitystä vain, jos sisällössäsi on epätavallisia (ei-ASCII) merkkejä, mutta silloin sillä on merkitystä.
Muuten, se, että sillä on väliä, on syy siihen, että Python siirtyi käyttämään kahta eri tyyppiä binääri- ja tekstidataa varten: se ei voi muuntaa maagisesti niiden välillä, koska se ei tiedä koodausta, ellet kerro sitä sille! Ainoa tapa, jolla SINÄ tietäisit sen, on lukea Windowsin dokumentaatio (tai lukea se täältä).