PDA

Ver la versión completa : [Python] Cómo meter una carpeta en un zip?



akualung
22/05/2007, 00:50
Hola. Os escribo por si me pudierais echar una mano. Estoy realizando el proyecto final de mi ciclo formativo, que consiste en programar una serie de funciones en python que realicen cambios en documentos ODF (por ejemplo cambiar una imagen de varios documentos ODT a la vez, etc).

Como los archivos ODF son simples archivos ZIP con documentos XML dentro, estoy usando los módulos estandar de python para tratar archivos ZIP (import zipfile) y archivos XML (import xml.dom.minidom).

Resulta que no consigo adivinar cómo puedo meter carpetas en un archivo ZIP desde la API de python. No se qué método necesito para hacerlo. Me estoy mirando las propiedades y métodos de los objetos contenidos en zipfile: http://docs.python.org/lib/zipfile-objects.html pero no hay manera, no se me ocurre cómo. Lo único que he conseguido es, en el método write, poner un nombre de archivo como primer argumento (por ejemplo "a.txt") y como segundo argumento decirle "carpeta/a.txt" y entonces primero me crea dentro dle zip una carpeta con ese nombre y luego copia dentro el archivo. Pero no es exactamente eso lo que me interesa, sino poder crear carpetas vacias dentro del zip generado con python (o igual que añades un archivo al zip, añadir un directorio vacío).

Espero haberme explicado bien. A ver si alguien puede ayudarme, que se me echa encima el plazo y voy de mal en peor [Ahhh]

Gracias de antemano. Un saludo.

otto_xd
22/05/2007, 01:13
La verdad, no tengo ni idea de programar en pyton, pero lo logico seria que si le pasas un fichero NULL(el fichero que le pasas es un puntero a fichero, no? de pyton ni idea) y la ruta terminada en barra '/':
"/nombre_dir/" se cree un dir sin mas.

Saludos

akualung
22/05/2007, 02:19
Hola, Otto_xd, gracias por interesarte por mi problema. Intenté algo parecido a lo que has dicho. Yo no estoy todavía muy puesto en python, por lo que no sé si existe el objeto null en ese lenguaje, pero sí que existe el objeto None que, si no ando errado, a efectos es lo mismo que el null.

Intenté hacer lo que tú dices, pero el intérprete me daba un error de ejecución diciendo que la funcion esperaba un objeto de tipo String o Buffer (o sea, el nombre del fichero que se añadirá al archivo zip) como primer argumento, pero que en vez de eso recibía un objeto de tipo "nonetype", y ahí casca printándome el stacktrace. De todas formas, como has podido ver, no es un puntero a objeto file lo que pide, sino una cadena con el nombre del archivo a añadir.

bueno, el caso es que también probé a poner como argumento una cadena vacía y como segundo argumento un nombre cualquiera de directorio (para que se cree "on the fly"), pero entonces el intérprete casca diciendo que no encuentra ningún fichero o directorio con ese nombre (y eso me escama mucho, porque dice "ningún fichero o DIRECTORIO", así que debe haber manera de añadir directorios, a menos se trate de un mensaje estándar).

Gracias de todas formas por interesarte, Otto_xd. A ver mañana en clase si el tutor que lleva este proyecto me puede echar un cable.