Python | Crear archivos y buscar archivos por nombre

En este artículo, aprenderemos cómo crear o descomprimir archivos en formatos comunes (p. ej., .tar, .tgz o .zip) usando el módulo shutil.

El módulo shutil tiene dos funciones, make_archive()y unpack_archive()esa puede ser exactamente la solución.

Código #1:

import shutil
shutil.unpack_archive('Python-3.3.0.tgz')
shutil.make_archive('py33', 'zip', 'Python-3.3.0')

Producción :

'/Users/Dell/Downloads/py33.zip'

El segundo argumento make_archive()es el formato de salida deseado. Para obtener una lista de los formatos de archivo admitidos, utilice get_archive_formats().
 
Código #2:

shutil.get_archive_formats()

Producción :

[('bztar', "bzip2'ed tar-file"), 
 ('gztar', "gzip'ed tar-file"), 
 ('tar', 'uncompressed tar file'), 
 ('zip', 'ZIP file')]

Python tiene otros módulos de biblioteca para manejar los detalles de bajo nivel de varios formatos de archivo (p. ej., tarfile, zipfile, gzip, bz2, etc.). Sin embargo, para crear o extraer un archivo, realmente no hay necesidad de ir a un nivel tan bajo.
Uno puede simplemente usar estas funciones de alto nivel en shutil en su lugar. Las funciones tienen una variedad de opciones adicionales para registro, ensayos, permisos de archivos, etc.
 
Escribamos una secuencia de comandos que involucre la búsqueda de archivos, como una secuencia de comandos de cambio de nombre de archivo o una utilidad de archivador de registros, pero que no tenga que llamar a las utilidades de shell desde dentro de la secuencia de comandos de Python, o que proporcione un comportamiento especializado que no esté fácilmente disponible mediante el «desembolso».

Para buscar archivos, use la función os.walk() , proporcionándole el directorio de nivel superior.

Código #3: Función que encuentra un nombre de archivo específico e imprime la ruta completa de todas las coincidencias.

import os
  
def findfile(start, name):
    for relpath, dirs, files in os.walk(start):
  
        if name in files:
            full_path = os.path.join(start, relpath, name)
            print(os.path.normpath(os.path.abspath(full_path)))
  
if __name__ == '__main__':
    findfile(sys.argv[1], sys.argv[2])

Guarde este script como abc.pyy ejecútelo desde la línea de comando, ingresando el punto de inicio y el nombre como argumentos posicionales como:

bash % ./abc.py .myfile.txt

 
Cómo funciona ?

  • El os.walk()método atraviesa la jerarquía de directorios por nosotros, y para cada directorio que ingresa, devuelve una tupla de 3 que contiene la ruta relativa al directorio que está inspeccionando, una lista que contiene todos los nombres de directorio en ese directorio y una lista de nombres de archivo en ese directorio.
  • Para cada tupla, simplemente verifique si el nombre del archivo de destino está en la lista de archivos. Si es así, os.path.join()se utiliza para armar un camino.
  • Para evitar la posibilidad de caminos extraños como ././foo//bar, se utilizan dos funciones adicionales para arreglar el resultado.
  • El primero es os.path.abspath(), que toma un camino que puede ser relativo y forma el camino absoluto.
  • El segundo es os.path.normpath(), que normalizará la ruta, resolviendo así problemas con barras dobles, múltiples referencias al directorio actual, etc.

Aunque el código es bastante simple en comparación con las características de la utilidad de búsqueda que se encuentra en las plataformas UNIX, tiene la ventaja de ser multiplataforma. Además, se puede agregar una gran cantidad de funciones adicionales de manera portátil sin mucho trabajo.

Código #4: Función que imprime todos los archivos que tienen un tiempo de modificación reciente

import os
import time
  
def modified_within(top, seconds):
    now = time.time()
  
    for path, dirs, files in os.walk(top):
        for name in files:
            fullpath = os.path.join(path, name)
  
            if os.path.exists(fullpath):
                mtime = os.path.getmtime(fullpath)
                if mtime > (now - seconds):
                    print(fullpath)
                      
if __name__ == '__main__':
    import sys
  
    if len(sys.argv) != 3:
        print('Usage: {} dir seconds'.format(sys.argv[0]))
        raise SystemExit(1)
          
    modified_within(sys.argv[1], float(sys.argv[2]))

No le llevaría mucho tiempo crear operaciones mucho más complejas además de esta pequeña función usando varias características de los módulos os, os.path, glob y similares.

Publicación traducida automáticamente

Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *