[Python] Algoritmo cuasi-acabado de listado de archivos en un fichero

Iniciado por Shrick, 14 Mayo 2009, 00:07 AM

0 Miembros y 1 Visitante están viendo este tema.

Shrick

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 (python) [Seleccionar]
# -*- coding: cp1252 -*-

import os

directorio = os.getcwd()
lista = directorio

f = open('listado.txt', 'w')

directorio = directorio.split("\\")
directorio = directorio[0]

#print directorio

os.chdir(directorio + "\\")


def listado():
    i = 0
    archivos = os.listdir(directorio)
    while i <= len(archivos):
        if os.path.isfile(directorio+"\\"+archivos[i]) == True:
            f.write(directorio+"\\"+archivos[i]+"\n")
        else:
            subdirectorios(directorio+"\\"+archivos[i])
        i +=1

def subdirectorios(direc):
    j=0
    archivos=os.listdir(direc)
    while j < len(archivos):
        if os.path.isfile(direc+"\\"+archivos[j]) == True:
            f.write(direc+"\\"+archivos[j]+"\n")
        else:
            subdirectorios(direc+"\\"+archivos[j])
        j+=1

listado()

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 :( .
Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .

Anibal784

¿por qué no usar for?
Código (python) [Seleccionar]

for file in os.listdir(direc):
    path_to_file = direc + os.path.sep + file
    if os.path.isfile(path_to_file):
        f.write(path_to_file)
    else:
        subdirectorios(path_to_file)

El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

seroblood

En primer lugar sacale el punto y coma de
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 (python) [Seleccionar]

# -*- coding: cp1252 -*-

import os

directorio = os.getcwd()
lista = directorio

f = open('listado.txt', 'w')

directorio = directorio.split("\\")
directorio = directorio[0]



os.chdir(directorio + "\\")


def listado():
    i = 0
    archivos = os.listdir(directorio)
    while i <= len(archivos):
try:
if os.path.isfile(directorio+"\\"+archivos[i]) == True:
f.write(directorio+"\\"+archivos[i]+"\n")

else:
try:
subdirectorios(directorio+"\\"+archivos[i])
except:
print "WINDOWS FORBBIDEN !"
except IndexError:
print "ya ta aca cortamo"
i +=1

def subdirectorios(direc):
    j=0
    archivos=os.listdir(direc)
    while j < len(archivos):
        if os.path.isfile(direc+"\\"+archivos[j]) == True:
            f.write(direc+"\\"+archivos[j]+"\n")
        else:
            subdirectorios(direc+"\\"+archivos[j])
        j+=1

listado()

f.close()


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 ....

Shrick

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 (python) [Seleccionar]
import string

directorio = os.getcwd()
lista = directorio

f = open('listado.txt', 'w')

directorio = directorio.split("\\")
directorio = directorio[0]

os.chdir(directorio + "\\")


def listado():
    for file in os.listdir(directorio):
        archivo = directorio + os.path.sep + file
        if os.path.isfile(archivo):
            f.write(archivo+"\n")
        else:
            subdirectorios(archivo)

def subdirectorios(direc):
    #print direc       
    for file in os.listdir(direc):
        archivo = direc + os.path.sep + file
        if os.path.isfile(archivo):
            f.write(archivo+"\n")
        else:
            subdirectorios(archivo)

listado()

f.close()


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.
Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .