2013-06-09 6 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)) 

を取り除きますか?Pythonのは、私のようなバイトを取得していますバイトのB」 '

たとえば、バイトをリストに保存してから、このリストを同じイメージとして再度保存するとします。どのように進めますか?

ありがとうございます!

+1

'B'が、それはバイトだ意味あなたがバイトrepresenことがわかっている場合...あなたは '' – Ben

+7

byte.decode(「アスキー」)...それを取り除くためにしたくありませんASCII文字の – Pithikos

+0

@Pithikos bytes.decode( 'ascii')で修正します。 – Doruk

答えて

4

b "..."は、バイト列のPython表記であり、実際には存在しません。印刷されるだけです。それはあなたにいくつかの本当の問題を引き起こしますか?

+1

私はそれを保存したtxtに保存すると、b '' –

+0

と表示されます。これは文字列として保存されています。それが問題ならば、str(byte)[1:]は 'b'を削除します – jureslak

+0

[1:] menasは何ですか? –

12
あなたが本当に「Bを取り除く」する必要がある場合

あなたはbytes.decode機能を使用することができます。http://docs.python.org/3.3/library/stdtypes.html#bytes.decode

しかし、それはあなたが本当にこれを実行する必要はありませんあなたのコードからと思われる、あなたが本当にで動作する必要がありますバイト。

+1

デコード( 'utf-8')を試みましたが動作しませんでした –

+1

コードを表示してください。 – mishik

2

バイナリデータを操作するには、array-moduleを使用します。 以下は、すべてをオンスでメモリに読み込むのではなく、4096チャンクで動作するイテレータです。

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

これはb''を取り除くための一つの方法である:

import sys 
print(b) 

あなたがバイトを保存したい場合は、後でそれがむしろリストを構築するよりも一度でファイル全体を読み取るために、より効率的で、このように:

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

b''は、ときにあなたprintそれを書かれているデータの唯一の文字列表現です。

decodeを使用すると、その文字が表す文字ではなく、バイトだけが必要なので、ここでは役に立ちません。文字列表現をスライスすると、元のバイトではなく、いくつかの無駄な文字( '\'、 'x'など)の文字列が残っているため、さらに少なくなります。

データがまだ存在するため、データの文字列表現を変更する必要はありません。文字列の代わりに使用してください(printは使用しないでください)。あなたがデータをコピーしたい場合は、単に行うことができます:あなたは出力したい場合は

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

はあなたのプログラムから直接、バイナリデータは、sys.stdout.buffer使用:ここで

import sys 

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

される一つの解決策

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

+1

それは欠陥があります。あなたは 'str(byte)[2:-1]'を意味します(異なるブラケットの配置に注意してください)。しかし、訂正しても、順方向/逆方向互換、または透過的/維持可能な方法ではありません。 – jez

関連する問題