2011-12-28 35 views
5

Utilizando Python3, esperamos os.walk un directorio de archivos, léelos en un objeto binario (¿cadena?) Y haga un procesamiento adicional en ellos. Primer paso, sin embargo: ¿Cómo leer los resultados de los archivos de os.walk?¿Cómo leer el contenido del archivo desde un archivo?

# 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) 

ERROR:

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 

Respuesta

9

para leer un archivo binario debe abrir el archivo en modo binario. Cambiar

input = open(fullpath, "r") 

a

input = open(fullpath, "rb") 

El resultado de la lectura() será un objeto bytes().

+0

Tks, Lennart - Sí, esto era el ingrediente secreto que necesitaba. ¡Algo nuevo para Python3! – DrLou

+0

No es en realidad Python que 3 específico. Los archivos binarios también deben abrirse con la bandera 'b' en Python 2. –

+1

Sí, todo parece bastante tonto en retrospectiva, ¡pero así es como los idiotas aprendemos! Probablemente estés pensando: ¡RTFM! Gracias de nuevo por la ayuda. – DrLou

3

Como algunos de sus archivos son binarios, no se pueden decodificar con éxito en caracteres Unicode que Python 3 usa para almacenar todas las cadenas en el intérprete. Tenga en cuenta que un gran cambio entre Python 2 y Python 3 implica la migración de la representación de cadenas a caracteres Unicode desde ASCII, lo que significa que no se puede tratar simplemente como un byte (sí, las cadenas de texto en Python 3 requieren 2x o 4x tanta memoria para almacenar como Python 2, ya que UTF-8 usa hasta 4 bytes por carácter).

Es por lo tanto tiene una serie de opciones que dependerán de su proyecto:

  • Ignorar archivos binarios, filtrando por la extensión de archivo,
  • Leer los archivos binarios y, o bien detectar la excepción de decodificación, siempre y cuando se produce, y omitir el archivo o utilice uno de los métodos descritos en este hilo How can I detect if a file is binary (non-text) in python?

en este orden de ideas, es posible editar su solución simplemente detectar el error UnicodeDecode y omitir el archivo.

Independientemente de su decisión, es importante tener en cuenta que si hay una amplia gama de codificaciones de caracteres diferentes en los archivos de su sistema, deberá especificar la codificación ya que Python 3.0 supondrá que los caracteres están codificados en UTF -8.

Como referencia, una gran presentación en Python 3 E/S: http://www.dabeaz.com/python3io/MasteringIO.pdf

+0

Gracias por este enlace y por sus comentarios; estos serán muy útiles en mi proceso de aprendizaje. Hasta ahora, al menos, todos los archivos parecen ser fácilmente legibles como binarios. – DrLou

Cuestiones relacionadas