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

这是摆脱的一种方法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 回答
-4

这是一种解决方案

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

于 2015-04-01T04:00:27.130 回答