web-dev-qa-db-ja.com

Pythonでバイト単位でファイルを読み取る方法、およびバイトリストをバイナリとして印刷する方法は?

バイト単位でファイルを読み取ろうとしていますが、その方法がわかりません。私はそのようにしようとしています:

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

それで、すべてのループの先頭に変数バイトに次の8ビットが含まれるようになりますか?それらのバイトが実際に何であるかは関係ありません。重要なのは、8ビットスタックでファイルを読み取る必要があることだけです。

編集:

また、これらのバイトをリストに収集し、ASCII文字として印刷されないように印刷したいのですが、生のバイトとして、つまりそのバイトリストを印刷すると結果が得られますなので

['10010101', '00011100', .... ]
25
zaplec

質問の2番目の部分に答えるには、バイナリに変換するために format stringord 関数を使用できます。

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

フォーマットには適切な数の先行ゼロが埋め込まれていることに注意してください。これが要件のようです。このメソッドには、Python 2.6以降が必要です。

18
Scott Griffiths

1バイトを読み取るには:

file.read(1)

8ビットは1バイトです。

36
Mark Byers

表示したコードは8 bytesになります。使用できます

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

struct 」と呼ばれるバイナリエンコードデータの読み書き用に特に作成されたpythonモジュールがあります。 2.6未満のPythonのバージョンはstr.formatをサポートしていないため、バイナリ形式の文字列を作成するには カスタムメソッド を使用する必要があります。

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
2
Owen Champion

パーティーに遅れましたが、これは迅速な解決策を探している人を助けるかもしれません:

bin(ord('b')).replace('b', '') bin()を使用すると、最後のビットの後に「b」が付いたバイナリ表現が得られます。削除する必要があります。また、ord()は、charにASCII番号)または8ビット/ 1バイトのコード化文字を提供します。

乾杯

0
e-nouri