Siguiente código de ejemplo, el objetivo es simplemente combina los archivos de texto de dar de carpetas y sub carpetas. me estoy poniendo de Trazas en ocasiones no tan seguro de dónde buscar. también necesita algo de ayuda para mejorar el código para evitar que la línea en blanco se mezcla & para mostrar que no hay líneas en fusionado/archivo maestro. Probablemente es una buena idea, antes de la fusión de archivo, algunas limpieza debe realizarse o simplemente ignora línea en blanco durante el proceso de fusión.

Archivo de texto en la carpeta de no más de 1000 líneas, pero el agregado del archivo maestro podría cruz 10000+ líneas muy fácilmente.

import os
root = 'C:\Dropbox\ans7i\'
files = [(path,f) for path,_,file_list in os.walk(root) for f in file_list]
out_file = open('C:\Dropbox\Python\master.txt','w')
for path,f_name in files:
    in_file = open('%s/%s'%(path,f_name), 'r')

    # write out root/path/to/file (space) file_contents
    for line in in_file:
        out_file.write('%s/%s %s'%(path,f_name,line))
    in_file.close()

    # enter new line after each file
    out_file.write('\n')

with open('master.txt', 'r') as f:
  lines = f.readlines()
with open('master.txt', 'w') as f:
  f.write("".join(L for L in lines if L.strip())) 



Traceback (most recent call last):
  File "C:\Dropbox\Python\master.py", line 9, in <module> for line in in_file:
  File "C:\PYTHON32\LIB\encodings\cp1252.py", line  23, in decode return codecs.charmap_decode(input,self.errors,decoding_table)[0]  
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 972: character maps to <undefined>  
  • ¿El error realmente se producen en for line in in_file? Supongo que es la línea después de eso, pero no realmente seguro. Puede usted probar si Python se ejecuta en el bucle?
  • es en esa línea, la traza es muy clara. Al leer el archivo que se genere un error.
  • pero un UnicodeDecodeError? Raro.
  • no extraño en absoluto, python 3 decodifica archivos de texto automáticamente.
  • ahhh, Python 3. Está bien, entonces.
InformationsquelleAutor user1582596 | 2012-08-31

1 Comentario

  1. 5

    El error se produce debido a Python 3 abre sus archivos con la codificación predeterminada que no coincide con el contenido.

    Si todo lo que están haciendo es copiar el contenido del archivo, usted sería mejor usar el shutil.copyfileobj() función junto con la apertura de los archivos en modo binario. De esa manera evitar problemas de codificación del todo (siempre y cuando todos los archivos de origen son el misma codificación de curso, por lo que no terminan con un archivo de destino con una mezcla de codificaciones):

    import shutil
    import os.path
    
    with open('C:\Dropbox\Python\master.txt','wb') as output:
        for path, f_name in files:
            with open(os.path.join(path, f_name), 'rb') as input:
                shutil.copyfileobj(input, output)
            output.write(b'\n') # insert extra newline between files

    He limpiado el código de un poco de contexto de uso de los gestores (de modo que tus archivos se cierran automáticamente cuando se hace), y el uso de os.path para crear la ruta de acceso completa para sus archivos.

    Si usted necesita para procesar su entrada de línea por línea, usted necesitará decirle a Python lo que la codificación de esperar, así que puede decodificar el contenido del archivo de python para objetos string:

    open(path, mode, encoding='UTF8')

    Tenga en cuenta que esto requiere que usted sepa frente lo que la codificación de los archivos de uso.

    Leer sobre el Python Unicode HOWTO si usted tiene más preguntas acerca de python 3, archivos y codificaciones.

    • Mis archivos de prueba muy básica en la naturaleza, pero a veces hay contenido pegado y se ve como es la creación de problema.
    • Cansados por encima de 1 de código, y ahora de conseguir algunos de error preciso, dice TypeError: archivo no válido: y trató de señalar a un archivo. pero lo raro es que, esto es sólo un archivo en blanco.
    • se puede utilizar pastie.org me muestra la traza?
    • También, el copyfileobj implementación de la función es muy simple; todo lo que hace es leer un búfer de tamaño importe de la entrada, y escribe que a la salida, hasta que todos los archivos de entrada que ha leído.
    • 10x, aquí está el último código de rastreo, como una prueba, eliminado .archivo txt y pero la próxima vez el mismo error devuelve por otro archivo de texto. pastie.org/4630939
    • Ah, mi error, actualizar el ejemplo. El os.path.join() función toma múltiples argumentos, no una tupla.
    • 10x, lo Intentaron, pero otro de trazas _http://pastie.org/4631278
    • Lo siento, uso .write(b'\n') lugar; lo que necesitamos para escribir bytes, no de python (unicode) cadenas como el archivo se abre en modo binario. Respuesta ajustada.
    • hmmm, algo no está bien …_http://pastie.org/4631521
    • ese es el código debajo de mis cambios, que se lea todas las líneas en el archivo maestro a la tira de ellos. Usted todavía tendrá que encontrar una codificación para aquellos que, o idear una manera de leer y escribir en modo binario donde usted eliminar todos los espacios en blanco alrededor de los saltos de línea. Véase también la segunda parte de mi respuesta para esa parte. El trato con la eliminación de líneas en modo binario sería una interesante nuevo pregunta sobre el Desbordamiento de la Pila, tal vez.
    • es allí cualquier manera de determinar, que el archivo de texto es la creación de problema. puede ser que se trate de rectificar el problema manualmente y vuelva a ejecutar el programa.
    • usted puede hacer eso con un bucle por todos los nombres de los archivos, de impresión, el nombre del archivo, luego abrir el archivo en modo texto (open(filename, 'r'), el bucle sobre el archivo para leer todas las líneas, hasta llegar a la excepción. El último nombre de archivo impreso es su problema el archivo.
    • «la impresión (in_file)» ¿el tweak, problema con dos archivos de texto y rectificado de forma manual. muchos de 10x para su tiempo, en la reciente ayuda. Me quito el sombrero, para su conocimiento y el intercambio de conocimientos espíritu.

Dejar respuesta

Please enter your comment!
Please enter your name here