2013-06-09 17 views
18
import save 

string = "" 

with open("image.jpg", "rb") as f: 
    byte = f.read(1) 
    while byte != b"": 
     byte = f.read(1) 
     print ((byte)) 

sto ottenendo byte come:Python sbarazzarsi di byte b''

b'\x00'

Come faccio a sbarazzarsi di questo b''?

Diciamo che voglio salvare i byte in un elenco e quindi salvare di nuovo l'elenco come la stessa immagine. Come procedo?

Grazie!

+1

Il 'B' significa che è un byte ... non si vuole sbarazzarsi di esso ... – Ben

+7

' byte.decode ('ascii') 'se si sa che i rappre byte ts un carattere ASCII – Pithikos

+0

@Pithikos bytes.decode ('ascii'), per correggerlo. – Doruk

risposta

4

Il b "..." è solo una notazione python di stringhe di byte, non è proprio lì, viene solo stampata. Ti provoca qualche problema reale?

+1

Quando lo salvi in ​​un txt, salva con il b '' –

+0

vedo, lo stai salvando come stringa.Se questo è il problema allora str (byte) [1:] dovrebbe rimuovere la 'b' – jureslak

+0

cosa [1:] menas? –

12

È possibile utilizzare la funzione bytes.decode se si ha realmente bisogno di "sbarazzarsi di b": http://docs.python.org/3.3/library/stdtypes.html#bytes.decode

ma sembra dal codice che non si ha realmente bisogno di fare questo, si ha realmente bisogno di lavorare con byte.

+1

Ho provato la decodifica ('utf-8') e non ha funzionato –

+1

Si prega di mostrare il codice. – mishik

2

Per operare su dati binari è possibile utilizzare array-module. Di seguito è riportato un iteratore che opera su 4096 blocchi di dati anziché leggere tutto in memoria all'oncia.

import array 

def bytesfromfile(f): 
    while True: 
     raw = array.array('B') 
     raw.fromstring(f.read(4096)) 
     if not raw: 
      break 
     yield raw 

with open("image.jpg", 'rb') as fd 
    for byte in bytesfromfile(fd): 
     for b in byte: 
      # do something with b 
2

questo è un modo per sbarazzarsi del b'':

import sys 
print(b) 

Se si desidera salvare i byte in seguito è più efficiente per leggere l'intero file in una volta, piuttosto che la costruzione di una lista, in questo modo:

with open('sample.jpg', mode='rb') as fh: 
    content = fh.read() 
    with open('out.jpg', mode='wb') as out: 
     out.write(content) 
3

il b'', è solo la rappresentazione di stringa dei dati che viene scritto quando si print esso.

L'utilizzo di decode non ti aiuterà qui perché desideri solo i byte, non i caratteri che rappresentano. Tagliare la rappresentazione della stringa ti aiuterà ancora meno perché in questo modo ti rimane una serie di caratteri inutili ('\', 'x' e così via), non i byte originali.

Non è necessario modificare la rappresentazione della stringa dei dati, perché i dati sono ancora presenti. Basta usarlo al posto della stringa (ad esempio non utilizzare print). Se si desidera copiare i dati, si può semplicemente fare:

data = file1.read(...) 
... 
file2.write(data) 

Se si desidera attivare i dati binari direttamente dal programma, utilizzare il sys.stdout.buffer:

import sys 

sys.stdout.buffer.write(data) 
-3

Ecco una soluzione

print(str(byte[2:-1]))

+1

Questo è difettoso. Intendi 'str (byte) [2: -1]' (nota la diversa posizione delle parentesi). Tuttavia, anche quando corretto, non è un modo molto avanti/indietro compatibile, o trasparente/manutenibile, per farlo. – jez

Problemi correlati