21
import save

string = ""

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

次のようなバイトを取得しています:

b'\x00'

どうすればこれを取り除くことができb''ますか?

バイトをリストに保存し、このリストを同じ画像として再度保存したいとしましょう。続行するにはどうすればよいですか?

ありがとう!

4

6 に答える 6

13

本当に「bを取り除く」必要がある場合は、bytes.decode関数を使用できます:http://docs.python.org/3.3/library/stdtypes.html#bytes.decode

しかし、あなたのコードからは、実際にはこれを行う必要はなく、バイトを扱う必要があるようです。

于 2013-06-09T19:05:03.353 に答える
4

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

于 2013-06-09T19:04:41.417 に答える
3

, は、そのb''ときに書き込まれるデータの文字列表現にすぎませprintん。

を使用してdecodeも、バイトが表す文字ではなくバイトのみが必要なため、ここでは役に立ちません。文字列表現をスライスしても、元のバイトではなく、いくつかの役に立たない文字 (「\」、「x」など) の文字列が残るため、あまり役に立ちません。

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

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

プログラムからバイナリ データを直接出力する場合は、次を使用しますsys.stdout.buffer

import sys

sys.stdout.buffer.write(data)
于 2014-07-29T14:27:07.817 に答える
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 
于 2013-06-09T19:14:22.860 に答える
2

これは、を取り除く 1 つの方法です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)
于 2013-06-09T19:15:59.790 に答える