es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eres un traductor de español que traduce documentos de tecnología de la información. Traduce el siguiente texto al español: “Zip los archivos en un directorio dado en el mismo directorio usando Python.” Please provide the text that needs to be translated as well as the filenames and directory paths involved in order to accurately translate the given instruction.

Estoy trabajando en un directorio con la ruta “C:\Downloads\Project”. Tengo una carpeta “Insights” en la carpeta “Project” (carpeta “Project\Insights”) que tiene varios archivos de texto con nombres como “Text1.txt”, “Text2.txt”, … “Text30.txt”. Cada 10 archivos de texto deben comprimirse en un archivo zip en la misma carpeta “Insights” (…\Insights\zip1.zip).

¿Cómo se puede hacer esto en Python?

Cuando intenté comprimir, los archivos de texto se almacenaron con la estructura de directorio “…\Project\Insights\text1.txt” en el archivo zip. Pero no quiero que los archivos se almacenen con ninguna estructura de directorio.

from zipfile import ZipFile

#diccionario de archivos y datos en él (datos ficticios)
file_data={"C:\Downloads\Project\Insights\Text1.txt":"valor1",
            "C:\Downloads\Project\Insights\Text2.txt":"valor2"
          }

zipp = ZipFile('Insights//zip1.zip', 'w')
for k, v in file_data.items():
    zipp.write(k)
zipp.close()

Este fragmento de código genera un archivo zip con toda la estructura de directorio. Pero solo quiero los archivos de texto.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para comprimir los archivos de texto sin ninguna estructura de directorio, podemos modificar la ruta del archivo que se está escribiendo en el archivo zip utilizando el método basename() del módulo os. Aquí está cómo se puede modificar el código:

    import os
    from zipfile import ZipFile
    
    # lista de archivos de texto en la carpeta Insights
    text_files = [os.path.join('C:', 'Downloads', 'Project', 'Insights', f) for f in os.listdir('Insights') if f.endswith('.txt')]
    
    # dividir los archivos de texto en fragmentos de 10 y crear archivos zip
    for i in range(0, len(text_files), 10):
        chunk = text_files[i:i+10]
        zip_path = os.path.join('C:', 'Downloads', 'Project', 'Insights', f'zip{i//10+1}.zip')
        with ZipFile(zip_path, 'w') as zipf:
            for file in chunk:
                zipf.write(file, os.path.basename(file))
    

    Aquí, primero creamos una lista de todos los archivos de texto en la carpeta Insights utilizando os.listdir() y os.path.join(). Luego, usamos range() y el slicing para dividir la lista en fragmentos de 10. Para cada fragmento, creamos un nuevo archivo zip utilizando ZipFile() e iteramos sobre los archivos de texto en el fragmento utilizando un bucle for. Dentro del bucle, escribimos el archivo en el archivo zip utilizando write(), pero con el segundo argumento establecido en el nombre de archivo base (sin ninguna estructura de directorio) utilizando os.path.basename(). Finalmente, la declaración with asegura que el archivo zip se cierre después de escribir todos los archivos.

Comments are closed.