file - Python 读取和写入二进制文件

标签 file python-3.x binary

以下是我重新措辞的问题

读取二进制文件的前 10 个字节(稍后操作) -

infile = open('infile.jpg', 'rb')
outfile = open('outfile.jpg', 'wb')
x = infile.read(10)
for i in x:
    print(i, end=', ')
print(x)
outfile.write(bytes(x, "UTF-8"))

第一个打印语句给出 -
255, 216, 255, 224, 0, 16, 74, 70, 73, 70, 

第二个打印语句给出 -
b'\xff\xd8\xff\xe0\x00\x10JFIF'

x 中值的十六进制解释。
outfile.write(bytes(x, "UTF-8"))

返回 -
TypeError: encoding or errors without a string argument

那么 x 一定不是普通字符串而是字节字符串,它仍然是可迭代的?

如果我想将 x 的内容原封不动地写入 outfile.jpg ,那么我去 -
outfile.write(x)

现在我尝试获取每个 x [i] 并对每个 x [i] 执行一些操作(如下所示为 1 的简单乘积),将值分配给 y 并将 y 写入 outfile.jpg 使其与 infile.jpg 相同。所以我尝试 -
infile = open('infile.jpg', 'rb')
outfile = open('outfile.jpg', 'wb')
x = infile.read(10)

yi = len(x)
y = [0 for i in range(yi)]

j = 0
for i in x:
    y [j] = i*1
    j += 1

for i in x:
    print(i, end=', ')

print(x)

for i in y:
    print(i, end=', ')

print(y)

print(repr(x))
print(repr(y))

outfile.write(y)

第一个打印语句(遍历 x)给出 -
255, 216, 255, 224, 0, 16, 74, 70, 73, 70,

第二个打印语句给出 -
b'\xff\xd8\xff\xe0\x00\x10JFIF'

第三个打印语句(遍历 y)给出 -
255, 216, 255, 224, 0, 16, 74, 70, 73, 70,

打印语句给出 -
[255, 216, 255, 224, 0, 16, 74, 70, 73, 70]

最后,按照 Tim 的建议,打印 repr(x) 和 repr(y) 分别给出 -
b'\xff\xd8\xff\xe0\x00\x10JFIF'
[255, 216, 255, 224, 0, 16, 74, 70, 73, 70]

并且文件写入语句给出了错误 -
TypeError: 'list' does not support the buffer interface

我需要的是 y 与 x 的类型相同,这样 outfile.write(x) = outfile.write(y)

我凝视着 python 的眼睛,但我仍然看不到它的灵魂。

最佳答案

它们根本不相同 - 它们只是在 str() 之后显示相同应用于它们(print() 隐式执行)。打印 repr()他们,你会看到差异。例子:

>>> x = b'ab'
>>> y = "b'ab'"
>>> print(x)
b'ab'
>>> print(y) # displays identically
b'ab'
>>> print(repr(x)) # but x is really a 2-byte bytes object
b'ab'
>>> print(repr(y)) # and y is really a 5-character string
"b'ab'"

混合字符串和字节对象是没有意义的(好吧,不是在没有显式编码的情况下 - 但你并没有试图在这里编码/解码任何东西,对吧?)。如果你正在处理二进制文件,那么你根本不应该使用字符串——你应该使用 bytesbytearray对象。

所以问题不在于你的写作方式:在那之前,逻辑从根本上是困惑的。

猜不到你想要什么。请编辑问题以显示您要完成的任务的完整、可执行示例。为此,我们不需要 JPG 文件 - 组成一些简短的、任意的二进制数据。喜欢:
dummy_jpg = b'\x01\x02\xff'

关于file - Python 读取和写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20668508/

相关文章:

python - 如何通过重新启动应用程序来克服ModbusTcpServer中的 "Address already in use"?

c - 如何将二进制数分成几部分? C语言

c# - Protobuf-Net 的实现可以击败我目前拥有的吗?

c# - 在大型文本文件中定位包含特定单词的行的最快方法

c - C中通过特定方式读取和更改文件信息

php - 大文件上传

linux - hexdump 并将二进制文件读取为文本

无法在 GNU/Linux 中读取二进制视频文件

python - 如何将 Pandas 中的重复编号列转换为单个非编号列?

python-3.x - 我想从文本输入中提取第三行