读取二进制文件(Python)

7

我无法读取文件,也不明白为什么会这样:

f = open("test/test.pdf", "r")
data = list(f.read())
print data

返回结果:

返回结果:[]

我想打开一个PDF文件,提取每个字节并将其放入列表中。

我的代码有什么问题? :(

谢谢。


测试/测试.pdf实际上有多少字节? - Daniel Stutzbach
4个回答

12
f = open("test/test.pdf", "rb")

在 Windows 上读写文件时,必须包含伪模式“b”以进行二进制操作。否则,操作系统会将其认为是“行结束符”的内容进行静默转换,导致输入输出出现错误。


1

如果你在Windows系统上,Jonathan是正确的,你应该以二进制模式打开文件。

然而,PDF文件将以“%PDF-”开头,无论你是否使用二进制模式,它至少会被读取。

所以我认为你的“test/test.pdf”是一个空文件。


1
  • 据我所知,PDF格式文件不应该是二进制文件。它应该是一个文本文件,其中可能包含许多二进制块。但我可能错了。
  • 在Windows上,如果您要打开一个二进制文件,则需要在文件模式中包含b,即open(filename, "rb")
    • 在类Unix系统上,b不会对任何东西造成伤害,但也没有任何意义。
  • 始终使用上下文管理器处理文件。也就是说,不要写f = open("test/test.pdf", "rb"),而是写with open("test/test.pdf", "r") as f:。这将确保您的文件始终被关闭。
  • list(f.read())很少有用。 f.read()返回一个str,并调用list将其转换为字符列表(一字节字符串)。这很少需要。
  • 无论是二进制还是文本,read都应该有效。您确定test/test.pdf中有任何内容吗?Python似乎认为没有。

0
你正在使用什么平台? 在Windows XP上使用Python 2.6,我得到:
f = open("14500lf.pdf", "r") data = list(f.read()) print data ['%', 'P', 'D', 'F', '-', '1', '.', '5', '\r', '%', '\xe2', '\xe3', '\xcf', '\xd3', '\n', '1', ' ', '0', ' ', 'o', 'b', 'j', '<', '<', '/', 'C', 'o', 'n', 't', 'e', 'n', 't', 's', ' ', '3', ' ', '0', ' ', 'R', '/', 'T', 'y', 'p', 'e', '/', 'P', 'a', 'g', 'e', '/', 'P', 'a', 'r', 'e', 'n', 't', ' ', '8', '7', ' ', '0', ' ', 'R', '/', 'T', 'h', 'u', 'm', 'b', ' ', '7', '1', ' ', '0', ' ', 'R', '/', 'R', 'o', 't', 'a', 't', 'e', ' ', '0', '/', 'M', 'e', 'd', 'i', 'a', 'B', 'o', 'x', '[', '0', ' ', '0', ' ', '6', '1', '2', ' ', '7', '9', '2', ']', '/', 'C', 'r', 'o', 'p', 'B', 'o', 'x', '[', '0', ' ', '0', ' ', '6', '1', '2', ' ', '7', '9', '2', ']', '/', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', ' ', '2', ' ', '0', ' ', 'R', '>', '>', '\r', 'e', 'n', 'd', 'o', 'b', 'j', '\r', '2', ' ', '0', ' ', 'o', 'b', 'j', '<', '<', '/', 'C', 'o', 'l', 'o', 'r', 'S', 'p', 'a', 'c', 'e', '<', '<', '/', 'D', 'e', 'f', 'a', 'u', 'l', 't', 'R', 'G', 'B', ' ', '1', '0', '0', ' ', '0', ' ', 'R', '>', '>', '/', 'F', 'o', 'n', 't', '<', '<', '/', 'F', '5', ' ', '9', '6', ' ', '0', ' ', 'R', '/', 'F', '7', ' ', '9', '7', ' ', '0', ' ', 'R', '/', 'F', '9', ' ', '1', '0', '6', ' ', '0', ' ', 'R', '/', 'F', '1', '1', ' ', '1', '0', '7', ' ', '0', ' ', 'R', '/', 'F', '1', '4', ' ', '1', '1', '1', ' ', '0', ' ', 'R', '/', 'F', '1', '6', ' ', '1', '1', '6', ' ', '0', ' ', 'R', '/', 'F', '1', '7', ' ', '1', '1', '7', ' ', '0', ' ', 'R', '/', 'F', '1', '3', ' ', '1', '1', '2', ' ', '0', ' ', 'R', '>', '>', '/', 'P', 'r', 'o', 'c', 'S', 'e', 't', '[', '/', 'P', 'D', 'F', '/', 'T', 'e', 'x', 't', ']', '>', '>', '\r', 'e', 'n', 'd', 'o', 'b', 'j', '\r', '3', ' ', '0', ' ', 'o', 'b', 'j', '<', '<', '/', 'L', 'e', 'n', 'g', 't', 'h', ' ', '4', ' ', '0', ' ', 'R', '/', 'F', 'i', 'l', 't', 'e', 'r', '/', 'F', 'l', 'a', 't', 'e', 'D', 'e', 'c', '

我在桌面上有一份PDF文件(它是一个IC数据表LTC1450

使用“rb”(读取二进制):

f = open("14500lf.pdf", "rb") data = list(f.read()) print data ['%', 'P', 'D', 'F', '-', '1', '.', '5', '\r', '%', '\xe2', '\xe3', '\xcf', '\xd3', '\r', '\n', '1', ' ', '0', ' ', 'o', 'b', 'j', '<', '<', '/', 'C', 'o', 'n', 't', 'e', 'n', 't', 's', ' ', '3', ' ', '0', ' ', 'R', '/', 'T', 'y', 'p', 'e', '/', 'P', 'a', 'g', 'e', '/', 'P', 'a', 'r', 'e', 'n', 't', ' ', '8', '7', ' ', '0', ' ', 'R', '/', 'T', 'h', 'u', 'm', 'b', ' ', '7', '1', ' ', '0', ' ', 'R', '/', 'R', 'o', 't', 'a', 't', 'e', ' ', '0', '/', 'M', 'e', 'd', 'i', 'a', 'B', 'o', 'x', '[', '0', ' ', '0', ' ', '6', '1', '2', ' ', '7', '9', '2', ']', '/', 'C', 'r', 'o', 'p', 'B', 'o', 'x', '[', '0', ' ', '0', ' ', '6', '1', '2', ' ', '7', '9', '2', ']', '/', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', ' ', '2', ' ', '0', ' ', 'R', '>', '>', '\r', 'e', ....Snip a few thousand lines... '9', '1', ' ', '0', ' ', 'R', '/', 'I', 'D', '[', '<', 'd', 'd', '3', 'd', '2', '8', 'e', '1', 'd', '9', '0', '4', '6', 'e', '1', 'f', '6', 'e', '7', '0', '8', 'b', 'd', '8', 'e', '4', 'f', '9', 'b', '1', '3', '>', '<', '4', '3', '8', 'a', '7', '7', '2', '3', 'f', 'b', '2', '9', 'e', '7', '4', '6', 'a', '4', 'd', '4', '1', '6', 'a', 'f', '7', '6', '2', 'd', '8', '0', '9', '5', '>', ']', '>', '>', '\r', '\n', 's', 't', 'a', 'r', 't', 'x', 'r', 'e', 'f', '\r', '\n', '2', '9', '0', '2', '6', '9', '\r', '\n', '%', '%', 'E', 'O', 'F', '\r', '\n']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接