Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Shrick en 14 Mayo 2009, 00:07 am



Título: [Python] Algoritmo cuasi-acabado de listado de archivos en un fichero
Publicado por: Shrick en 14 Mayo 2009, 00:07 am
La idea es indexar todos y cada uno de tus archivos en un simple archivo, para después cuando quieras buscar un archivo, simplemente buscas, es simplemente mera curiosidad este algoritmo y es para probar como se recorrería una estructura de árbol.

La forma más adecuada o sencilla es por medio de recursividad que si digo la verdad hasta hace 2 o 3 meses no tenia ni idea.

Hacerlo de forma iterativa es poco menos que cometer un suicidio, pero por supuesto es posible.

Yo en el algoritmo he ideado una combinación mixta de ambas, para recorrer hacia abajo he usado recursividad y para recorrer en lateral he usado la forma iterativa.

Código
  1. # -*- coding: cp1252 -*-
  2.  
  3. import os
  4.  
  5. directorio = os.getcwd()
  6. lista = directorio
  7.  
  8. f = open('listado.txt', 'w')
  9.  
  10. directorio = directorio.split("\\")
  11. directorio = directorio[0]
  12.  
  13. #print directorio
  14.  
  15. os.chdir(directorio + "\\")
  16.  
  17.  
  18. def listado():
  19.    i = 0
  20.    archivos = os.listdir(directorio)
  21.    while i <= len(archivos):
  22.        if os.path.isfile(directorio+"\\"+archivos[i]) == True:
  23.            f.write(directorio+"\\"+archivos[i]+"\n")
  24.        else:
  25.            subdirectorios(directorio+"\\"+archivos[i])
  26.        i +=1
  27.  
  28. def subdirectorios(direc):
  29.    j=0
  30.    archivos=os.listdir(direc)
  31.    while j < len(archivos):
  32.        if os.path.isfile(direc+"\\"+archivos[j]) == True:
  33.            f.write(direc+"\\"+archivos[j]+"\n")
  34.        else:
  35.            subdirectorios(direc+"\\"+archivos[j])
  36.        j+=1
  37.  
  38. listado()
  39.  
  40. f.close()

Solo tiene un pequeño problema:

Citar
  File "C:\Documents and Settings\Shrick\Mis documentos\Prog\Python\araña.py", line 35, in subdirectorios
    subdirectorios(direc+"\\"+archivos[j])
  File "C:\Documents and Settings\Shrick\Mis documentos\Prog\Python\araña.py", line 30, in subdirectorios
    archivos=os.listdir(direc)
TypeError: listdir() argument 1 must be (buffer overflow), not str

Que es debido seguramente a la capacidad de la lista al poner todos los archivos porque tiene un límite y no se me ocurre una solución :( .


Título: Re: [Python] Algoritmo cuasi-acabado de listado de archivos en un fichero
Publicado por: Anibal784 en 14 Mayo 2009, 01:59 am
¿por qué no usar for?
Código
  1. for file in os.listdir(direc):
  2.    path_to_file = direc + os.path.sep + file
  3.    if os.path.isfile(path_to_file):
  4.        f.write(path_to_file)
  5.    else:
  6.        subdirectorios(path_to_file)
  7.  


Título: Re: [Python] Algoritmo cuasi-acabado de listado de archivos en un fichero
Publicado por: seroblood en 14 Mayo 2009, 02:24 am
En primer lugar sacale el punto y coma de
Código:
f = open('listado.txt', 'w');

A mi tambien me tiraba un par de errores .. no identicos por que se ve que no tenemos la misma version pero eh de suponer que indican lo mismo la ejecucion del script se te detiene por dos motivos: uno por un problema con los atributos y privilegios de acceso a carpetas de informacion que puede ser sensible o lo que sea entonces te tira uno de esos errores de acceso denegado ... como ami... en ese caso lo arreglas con un try-except(arreglarno no lo arreglas  :xD pero asi ignoras con esas restricciones y seguis ejecutando(interpretando xd) el script)
Y otro error que puede largar una vez solucionado lo anterior claro es poner otro try-except xD para que no joda con lo de indexerror

aca te dejo como me quedo... el script lista todos los archivos ... excepto en aquellas carpetas en donde no se permite lectura....

Código
  1. # -*- coding: cp1252 -*-
  2.  
  3. import os
  4.  
  5. directorio = os.getcwd()
  6. lista = directorio
  7.  
  8. f = open('listado.txt', 'w')
  9.  
  10. directorio = directorio.split("\\")
  11. directorio = directorio[0]
  12.  
  13.  
  14.  
  15. os.chdir(directorio + "\\")
  16.  
  17.  
  18. def listado():
  19.    i = 0
  20.    archivos = os.listdir(directorio)
  21.    while i <= len(archivos):
  22. try:
  23. if os.path.isfile(directorio+"\\"+archivos[i]) == True:
  24. f.write(directorio+"\\"+archivos[i]+"\n")
  25.  
  26. else:
  27. try:
  28. subdirectorios(directorio+"\\"+archivos[i])
  29. except:
  30. print "WINDOWS FORBBIDEN !"
  31. except IndexError:
  32. print "ya ta aca cortamo"
  33. i +=1
  34.  
  35. def subdirectorios(direc):
  36.    j=0
  37.    archivos=os.listdir(direc)
  38.    while j < len(archivos):
  39.        if os.path.isfile(direc+"\\"+archivos[j]) == True:
  40.            f.write(direc+"\\"+archivos[j]+"\n")
  41.        else:
  42.            subdirectorios(direc+"\\"+archivos[j])
  43.        j+=1
  44.  
  45. listado()
  46.  
  47. f.close()
  48.  

Como dijo anibal con el for te va a resultar mejor y te vas a ahorrar andar con listas y evitar un indexerror pero igualmente vas a necesitar chekar eso de los atributos de las carpetas para que no te joda el interprete en plena ejecucion ....


Título: Re: [Python] Algoritmo cuasi-acabado de listado de archivos en un fichero
Publicado por: Shrick en 14 Mayo 2009, 13:51 pm
Muchas gracias a los dos ;) , aunque aparenta ir más lento pero eso me da igual porque hace lo que quiero y gracias a Anibal, esta más legible, yo es que no sabia sinceramente que se podía hacer de ese modo. Yo como quien dice soy de la vieja escuela.

Yo considero que estoy como administrador cuando ejecuto el programa, cuando consiga que funcione perfectamente entonces, ya pasamos a hablar de permisos de ficheros y carpetas, y su futura implementación a GNU\Linux que es mi objetivo final, lo he hecho para Windows precisamente para ahorrarme permisos y demás aunque ya se que se puede hacer sudo su, python archivo.py, y funciona igual, pero, como ya he dicho prefiero que sea así.

Pongo la corrección que me ha hecho Anibal:

Código
  1. import string
  2.  
  3. directorio = os.getcwd()
  4. lista = directorio
  5.  
  6. f = open('listado.txt', 'w')
  7.  
  8. directorio = directorio.split("\\")
  9. directorio = directorio[0]
  10.  
  11. os.chdir(directorio + "\\")
  12.  
  13.  
  14. def listado():
  15.    for file in os.listdir(directorio):
  16.        archivo = directorio + os.path.sep + file
  17.        if os.path.isfile(archivo):
  18.            f.write(archivo+"\n")
  19.        else:
  20.            subdirectorios(archivo)
  21.  
  22. def subdirectorios(direc):
  23.    #print direc        
  24.    for file in os.listdir(direc):
  25.        archivo = direc + os.path.sep + file
  26.        if os.path.isfile(archivo):
  27.            f.write(archivo+"\n")
  28.        else:
  29.            subdirectorios(archivo)
  30.  
  31. listado()
  32.  
  33. f.close()
  34.  

Eso si todavía persiste ese pequeño error, por el tema del tamaño del string.
Y seroblood no el ; que viste antes era del original XDD, sin embargo el interprete se lo paso por alto, es debido a que estoy como loco programado/aprobando object pascal de la uni, dentro de poco subire todos los apuntes que tengo.