читать бинарный файл (python) - PullRequest
7 голосов
/ 23 марта 2010

Я не могу прочитать файл, и я не понимаю, почему:

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

Возвращает: []

Я хотел бы открыть PDF-файл, извлечь каждый байт и поместитьэто в списке.

Что не так с моим кодом?: (

Спасибо,

Ответы [ 4 ]

11 голосов
/ 23 марта 2010
f = open("test/test.pdf", "rb")

Вы должны включить псевдо-режим "b" для двоичного кода при чтении и записи в Windows. В противном случае ОС молча переводит то, что она считает «окончанием строки», вызывая повреждение ввода-вывода.

1 голос
/ 23 марта 2010

Джонатан прав, что вы должны открывать файл в двоичном режиме, если вы находитесь в Windows.

Однако файл PDF будет начинаться с "% PDF-", который по крайней мере будет читаться независимоо том, используете ли вы двоичный режим или нет.

Так что мне кажется, что ваш "test / test.pdf" является пустым файлом

0 голосов
/ 23 марта 2010

На какой платформе вы работаете?

Используя python 2.6 в Windows XP, я получаю:

f = open ("14500lf.pdf", "r")
данные = список (f.read ())
данные печати
['%', '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', 'o', 'd ',' e ','> ','> ',' 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» (Read Binary):

f = open ("14500lf.pdf", "rb")
данные = список (f.read ())
данные печати
['%', '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', ​​

.... Отрежьте несколько тысяч строк ...

'9', '1', '', '0', '', 'R', '/', 'I', 'D', '[', '<', 'd', ' d ',' 3 ',' d ',' 2 ',' 8 ',«5», «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']

0 голосов
/ 23 марта 2010
  • Насколько я понимаю, формат 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? Питон, кажется, не думает, что есть.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...