Muunna tavut merkkijonoksi

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.

Ratkaisu

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'
Kommentit (18)

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)
Kommentit (0)

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ä).

Kommentit (2)