2010-05-20 7 views
21

Ich versuche, eine Datei Byte für Byte zu lesen, aber ich bin mir nicht sicher, wie das geht. Ich versuche, es so zu tun:Wie liest man eine Datei Byte für Byte in Python und wie man ein Webelet als Binärdatei druckt?

file = open(filename, 'rb') 
while 1: 
    byte = file.read(8) 
    # Do something... 

So macht das das variable Byte, um 8 nächste Bits am Anfang jeder Schleife zu enthalten? Es ist egal, was diese Bytes wirklich sind. Das einzige, was zählt, ist, dass ich eine Datei in 8-Bit-Stapeln lesen muss.

EDIT:

Auch sammle ich diese Bytes in einer Liste, und ich würde sie drucken möchten, so dass sie auszudrucken nicht als ASCII-Zeichen, sondern als Ausgangs Bytes dh wenn ich drucken, dass bytelist es das gibt Ergebnis als

['10010101', '00011100', .... ] 
+4

Verwenden Sie 'while True:' anstelle von 'while 1:'. –

+0

Diese Frage ist sehr ähnlich zu http://stackoverflow.com/questions/1035340/reading-binary-file-in-python. –

Antwort

18

verwenden, um den zweiten Teil Ihrer Frage zu beantworten, binär zu konvertieren Sie eine format string und die ord Funktion nutzen zu können:

>>> byte = 'a' 
>>> '{0:08b}'.format(ord(byte)) 
'01100001' 

Beachten Sie, dass die Format-Pads mit der richtigen Anzahl von führende Nullen, die Ihre Anforderung zu sein scheint. Diese Methode benötigt Python 2.6 oder höher.

28

ein Byte zum:

file.read(1) 

8 Bit ein Byte ist.

+1

Danke. Ich dachte, dass file.read (1) nur ein Bit lesen würde, aber es scheint ein Byte zu lesen. – zaplec

14

Der von Ihnen angezeigte Code lautet 8 Bytes. Sie könnten

with open(filename, 'rb') as f: 
    while 1: 
     byte_s = f.read(1) 
     if not byte_s: 
     break 
     byte = byte_s[0] 
     ... 
2

Es gibt ein Python-Modul, das speziell zum Lesen und Schreiben von binär codierten Daten mit dem Namen 'struct' entwickelt wurde. Da Python-Versionen unter 2.6 str.format nicht unterstützen, muss eine custom method verwendet werden, um binär formatierte Zeichenfolgen zu erstellen.

import struct 

# binary string 
def bstr(n): # n in range 0-255 
    return ''.join([str(n >> x & 1) for x in (7,6,5,4,3,2,1,0)]) 

# read file into an array of binary formatted strings. 
def read_binary(path): 
    f = open(path,'rb') 
    binlist = [] 
    while True: 
     bin = struct.unpack('B',f.read(1))[0] # B stands for unsigned char (8 bits) 
     if not bin: 
      break 
     strBin = bstr(bin) 
     binlist.append(strBin) 
    return binlist 
+1

Wenn Sie es nur für ein einzelnes Zeichen verwenden, sollten Sie besser 'ord (f.read (1))' anstelle von 'struct.unpack ('B', f.read (1)) verwenden.) [0] '? (Sie müssten etwas wie "c = f.read (1); wenn nicht c: break; binlist.append (bstr (ord (c)))".) –

0

spät zur Party, aber alle, die eine schnelle Lösung suchen helfen können:

Du bin(ord('b')).replace('b', '') ist() verwendet es Ihnen die binäre Darstellung mit einem ‚b‘ nach dem letzten Bit gibt, Sie müssen es entfernen. Auch ord() gibt Ihnen die ASCII-Nummer zum char oder 8-bit/1 Byte codierten Zeichen.

Prost

Verwandte Themen