2011-12-28 6 views
5

Utilizzando Python3, sperare di os.walk una directory di file, leggerli in un oggetto binario (stringa?) E fare qualche ulteriore elaborazione su di essi. Il primo passo, però: come leggere i risultati del file di os.walk?Come leggere il contenuto del file da un file?

# NOTE: Execute with python3.2.2 

import os 
import sys 

path = "/home/user/my-files" 

count = 0 
successcount = 0 
errorcount = 0 
i = 0 

#for directory in dirs 
for (root, dirs, files) in os.walk(path): 
# print (path) 
print (dirs) 
#print (files) 

for file in files: 

    base, ext = os.path.splitext(file) 
    fullpath = os.path.join(root, file) 

    # Read the file into binary? -------- 
    input = open(fullpath, "r") 
    content = input.read() 
    length = len(content) 
    count += 1 
    print (" file: ---->",base,"/",ext," [count:",count,"]", "[length:",length,"]") 
    print ("fullpath: ---->",fullpath) 

ERRORE:

Traceback (most recent call last): 
    File "myFileReader.py", line 41, in <module> 
    content = input.read() 
    File "/usr/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 11: invalid continuation byte 

risposta

9

Per leggere un file binario è necessario aprire il file in modalità binaria. Modificare

input = open(fullpath, "r") 

a

input = open(fullpath, "rb") 

Il risultato della lettura() sarà un oggetto byte().

+0

Tks, Lennart - Sì, questa è stata la salsa segreta di cui avevo bisogno. Un po 'nuovo per Python3! – DrLou

+0

In realtà non è Python specifico di 3. I file binari dovrebbero essere aperti con il flag 'b' anche in Python 2. –

+1

Sì, sembra tutto un po 'stupido per me in retrospettiva - ma è così che impariamo gli idioti! Probabilmente stai pensando: RTFM! Grazie ancora per l'aiuto. – DrLou

3

Poiché alcuni dei file sono binari, non possono essere decodificati con successo in caratteri unicode utilizzati da Python 3 per memorizzare tutte le stringhe nell'interprete. Nota che una grande modifica tra Python 2 e Python 3 implica la migrazione della rappresentazione di stringhe ai caratteri unicode da ASCII, il che significa che ogni carattere non può essere semplicemente trattato come un byte (sì, le stringhe di testo in Python 3 richiedono 2x 2xo 4x tanta memoria da memorizzare come Python 2, poiché UTF-8 utilizza fino a 4 byte per carattere).

È quindi dispone di un numero di opzioni che dipenderà il vostro progetto:

  • ignorare i file binari, filtrando dalla estensione del file,
  • Leggere i file binari e sia intercettare l'eccezione di decodifica se e quando si verifica, e saltare il file, o utilizzare uno dei metodi descritti in questa discussione How can I detect if a file is binary (non-text) in python?

in tale ottica, è possibile modificare la vostra soluzione per prendere semplicemente l'errore UnicodeDecode e saltare il file.

Indipendentemente dalla tua decisione, è importante notare che se c'è una vasta gamma di codifiche di caratteri diversi nei file sul tuo sistema, dovrai specificare la codifica in quanto Python 3.0 assumerà che i caratteri siano codificati in UTF -8.

Come riferimento, una grande presentazione su Python 3 I/O: http://www.dabeaz.com/python3io/MasteringIO.pdf

+0

Grazie per questo link e per i vostri commenti, questi saranno molto utili nel mio processo di apprendimento. Finora, almeno, tutti i file sembrano essere facilmente leggibili come binari. – DrLou