2015-03-19 16 views
5

Ho una stringa ASCII = "abcdefghijk". Voglio scrivere questo in un file binario in formato binario usando python.Scrittura di una stringa ASCII come binario in python

Ho cercato seguente:

str = "abcdefghijk" 
fp = file("test.bin", "wb") 
hexStr = "".join((("\\x%s") % (x.encode("hex"))) for x in str) 
fp.write(hexStr) 
fp.close() 

Tuttavia, quando apro il test.bin vedo il seguente in formato ASCII anziché binario.

\x61\x62\x63\x64\x65\x66\x67 

Lo capisco perché per due barre qui ("\\ x% s"). Come posso risolvere questo problema? Grazie in anticipo.

Aggiornamento:

In seguito mi dà il risultato atteso:

file = open("test.bin", "wb") 
file.write("\x61\x62\x63\x64\x65\x66\x67") 
file.close() 

Ma come faccio a raggiungere questo obiettivo con "abcdef" stringa ASCII. ?

+0

Tu * molto attentamente * codifica i caratteri come esadecimale - perché ti aspetti di vedere qualcos'altro? – jonrsharpe

+0

Quale risultato ti aspettavi allora? Non sono sicuro di aver capito cosa sia la * modalità binaria *, o anche cosa usi la notazione '\ xhh' di Python (ed è solo * sintassi *, un modo per produrre un valore, non il valore stesso). –

+0

@jonrsharpe, voglio scrivere "\ x61 \ x62 \ x63 \ x64 \ x65 \ x66 \ x67" come binario su test.bin (non come stringa ascii). Come lo posso fare? E infine il test.bin dovrebbe essere un file binario. – aMa

risposta

6

È frainteso quello che \xhh fa in stringhe Python. L'utilizzo della notazione \x in stringhe Python è solo la sintassi per produrre determinati codepoint.

È possibile utilizzare '\x61' per produrre una stringa oppure è possibile utilizzare 'a'; entrambi sono solo due modi per dire dammi una stringa con un carattere con valore esadecimale 61, ad es. il carattere a ASCII:

>>> '\x61' 
'a' 
>>> 'a' 
'a' 
>>> 'a' == '\x61' 
True 

La sintassi \xhh quindi, è non il valore; non c'è \ e non x e nessun 6 e 1 carattere nel risultato finale.

Si dovrebbe solo scrivere la stringa:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring) 

Non c'è nulla di magico file binari; l'unica differenza con un file aperto in modalità testo è che un file binario non tradurrà automaticamente le righe nuove \n nello standard del separatore di riga della piattaforma; per esempio. su Windows scrivendo \n produce invece \r\n.

Certamente non è necessario produrre escape esadecimali per scrivere dati binari.

In Python 3 stringhe sono dati Unicode e non può solo essere scritti in un file senza codifica, ma Python tipo str è byte già codificati. Così il Python 3 devi usare:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring.encode('ascii')) 

o devi usare una stringa di byte letterali; b'abcd'.

+0

buon chiarimento mi dimentico sempre delle modifiche alle stringhe in py3 –

+0

puoi andare anche oltre '' a 'è' \ x61'' –

+1

@JoranBeasley: ** no non puoi **. L'interprete CPython * potrebbe * scegliere di ottimizzare e tu * potrebbe * finire con lo stesso oggetto stringa (e quindi 'is' funziona), ma questo è ** non ** consigliabile e non dovresti mai contare su di esso. –

1

Penso che non si capisca necessariamente cosa sia binario/ascii ... tutti i file sono binari nel senso che sono solo bit. ascii è solo una rappresentazione di alcuni bit ... 99,9999% dei redattori di file mostrerà le vostre punte come ascii se possono, e se non c'è altra codifica dichiarato nel file stesso ...

fp.write("abcd") 

è esattamente equivelent a

fp.write("\x61\x62\x63\x64") 
Problemi correlati