2010-03-23 15 views
6

Non posso leggere un file, e io non capisco perché:leggere un file binario (python)

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

Returns: []

vorrei aprire un file PDF, ed estrarre ogni byte, e mettilo in una lista.

Cosa c'è di sbagliato nel mio codice? :(

Grazie,

+0

Quanti byte sono effettivamente in test/test.pdf? –

risposta

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

È necessario includere il pseudo-modalità "b" per i binari durante la lettura e la scrittura su Windows. In caso contrario, il sistema operativo si traduce in silenzio quello che considera "line finali", causando i/o la corruzione.

1

Jonathan è corretto che si dovrebbe aprire il file in modalità binaria, se siete su Windows.

Tuttavia, un file PDF inizierà con "% PDF-", che avrebbe almeno essere letti indipendentemente dal fatto che si stia utilizzando la modalità binaria o meno.

Quindi mi pare che il "test/test.pdf" è un file vuoto

0
  • come meglio ho capito il formato pdf, un file pdf non dovrebbe essere un file binario. Dovrebbe essere un file di testo che potrebbe contenere molti blob binari. Potrei sbagliarmi.
  • Su Windows, se si sta aprendo un file binario, è necessario includere nella modalità del file, ad esempio open(filename, "rb").
    • Su sistemi Unix, lo b non fa male nulla, anche se non significa niente.
  • Utilizzare sempre un gestore di contesto con i propri file. Vale a dire, invece di scrivere f = open("test/test.pdf", "rb"), dire with open("test/test.pdf", "r") as f:. Questo assicurerà che il tuo file venga sempre chiuso.
  • list(f.read()) non è probabile che sia un codice molto utile. f.read() ritorna a str e chiamando list crea un elenco dei caratteri (stringhe di un byte). Questo è molto raramente necessario.
  • Binario o testo o qualsiasi altra cosa, read dovrebbe funzionare. Sei sicuro che ci sia qualcosa in test/test.pdf? Python non sembra pensare che ci sia.
0

Su quale piattaforma si sta utilizzando?

con Python 2.6 su Windows XP, ottengo:

f = open ("14500lf.pdf", "r")
data = lista (f.read())
dati di stampa
['%', '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']

su un PDF mi capita di avere sul mio desktop (suo un IC Scheda LTC1450)

Utilizzo di "rb" (lettura binaria):

f = open ("14500lf.pdf", "rb")
data = lista (f.read())
dati di stampa
[ '%', '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 ',

.... Taglia alcune migliaia di righe ...

'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 ']

Problemi correlati