【发布时间】:2010-03-23 01:46:20
【问题描述】:
我无法读取文件,我不明白为什么:
f = open("test/test.pdf", "r")
data = list(f.read())
print data
返回:[]
我想打开一个 PDF,提取每个字节,然后把它放在一个列表中。
我的代码有什么问题? :(
谢谢,
【问题讨论】:
-
test/test.pdf 中有多少字节?
我无法读取文件,我不明白为什么:
f = open("test/test.pdf", "r")
data = list(f.read())
print data
返回:[]
我想打开一个 PDF,提取每个字节,然后把它放在一个列表中。
我的代码有什么问题? :(
谢谢,
【问题讨论】:
f = open("test/test.pdf", "rb")
在 Windows 上读写时,您必须包含二进制的伪模式“b”。否则操作系统会默默地翻译它认为是“行尾”的内容,从而导致 i/o 损坏。
【讨论】:
Jonathan 说得对,如果您在 Windows 上,您应该以二进制模式打开文件。
但是,PDF 文件将以“%PDF-”开头,无论您是否使用二进制模式,至少都会读入该文件。
所以在我看来,您的“test/test.pdf”是一个空文件
【讨论】:
b,即 open(filename, "rb")。
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 似乎认为没有。【讨论】:
你在什么平台上运行?
在 Windows XP 上使用 python 2.6,我得到:
f = open("14500lf.pdf", "r")
数据 = 列表(f.read())
打印数据
['%', 'P', 'D', 'F', '-', '1', '.', '5', '\r', '%', '\xe2', '\xe3 '、'\xcf'、'\xd3'、'\n'、'1'、''、'0'、''、'o'、'b'、'j'、''、'>'、'\r'、'e'、'n'、'd '、'o'、'b'、'j'、'\r'、'2'、''、'0'、''、'o'、'b'、'j'、''、'>'、'/'、'F'、'o'、'n '、't'、''、'>'、'/'、'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',''、'>'、's'、't'、'r'、'e'、'a'、'm'、'\n'、'H'、 '\x89'、'\xa4'、'W'、'\xd9'、'r'、'T'、'\xc9'、'\x11'、'\xfd'、'\x82'、'\xfb ', '\x0f', '\xf5', '\xd8', '\n', '\x8f', '\x8a', '\xda', '\x97', 'G', '!', '\x04', '\x06', '\x03']
在我的桌面上碰巧有一个 PDF(它是 IC 数据表 LTC1450)
使用“rb”(读取二进制):
f = open("14500lf.pdf", "rb")
数据 = 列表(f.read())
打印数据
['%', 'P', 'D', 'F', '-', '1', '.', '5', '\r', '%', '\xe2', '\xe3 '、'\xcf'、'\xd3'、'\r'、'\n'、'1'、''、'0'、''、'o'、'b'、'j'、'', '>', '\r', 'e',....剪掉几千行...
'9'、'1'、''、'0'、''、'R'、'/'、'I'、'D'、'['、''、''、']'、'> '、'>'、'\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']
【讨论】: