Error al usar listdir en Python

Resuelto Sakura asked hace 11 años • 9 respuestas

Estoy intentando obtener la lista de archivos en un directorio en particular y contar la cantidad de archivos en el directorio. Siempre recibo el siguiente error:

WindowsError: [Error 3] The system cannot find the path specified: '/client_side/*.*'

Mi código es:

print len([name for name in os.listdir('/client_side/') if os.path.isfile(name)])

Seguí el ejemplo de código que se proporciona aquí .

Estoy ejecutando el script Python en Pyscripter y el directorio /client_side/ existe. Mi código Python está en la carpeta raíz y tiene una subcarpeta llamada "client_side". ¿Puede alguien ayudarme en esto?

Sakura avatar Mar 17 '13 00:03 Sakura
Aceptado

Este error ocurre cuando utiliza os.listdiruna ruta que no hace referencia a una ruta existente.
Por ejemplo:

>>> os.listdir('Some directory does not exist')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
WindowsError: [Error 3] : 'Some directory does not exist/*.*'

Si desea utilizar os.listdir, debe garantizar la existencia de la ruta que utilizaría o utilizar os.path.existspara comprobar la existencia primero.

if os.path.exists('/client_side/'):
    do something
else:
    do something

Supongamos que su directorio de trabajo actual es c:\foobar, os.listdir('/client_side/')es equivalente a os.listdir('c:/client_side'), mientras que os.listdir('client_side/')es equivalente a os.listdir('c:/foobar/client_side'). Si su directorio client_side no está en la raíz, dicho error ocurrirá al usar os.listdir.

Para su problema de salida 0, recordemosos.listdir(path)

Devuelve una lista que contiene los nombres de las entradas en el directorio indicado por la ruta. La lista está en orden arbitrario. No incluye las entradas especiales '.' y '..' incluso si están presentes en el directorio.

y os.path.isfile(path).

Devuelve True si la ruta es un archivo normal existente. Esto sigue a enlaces simbólicos, por lo que tanto islink() como isfile() pueden ser verdaderos para la misma ruta.

listdirno devuelve ni las rutas absolutas ni las relativas, sino una lista del nombre de sus archivos, mientras que isfilerequiere la ruta. Por lo tanto, todos esos nombres darían lugar False.

Para obtener la ruta, podemos usar o os.path.joinconectar dos cadenas directamente.

print ([name for name in os.listdir(path)
        if os.path.isfile(os.path.join(path, name))])

O

print ([name for name in os.listdir('client_side/')
        if os.path.isfile('client_side/' + name)])
nymk avatar Mar 16 '2013 17:03 nymk

Decidí cambiar el código a:

def numOfFiles(path):
    return len(next(os.walk(path))[2])

y use lo siguiente para llamar al código:

print numOfFiles("client_side")

Muchas gracias a todos los que me dijeron cómo pasar el directorio de Windows correctamente en Python y a nrao91 aquí por proporcionar el código de función.

Sakura avatar Mar 17 '2013 03:03 Sakura

Dos cosas:

  1. os.listdir() no hace una comparación de patrones globales, use el módulo global para eso
  2. Probablemente no tenga un directorio llamado '/client_side/*.*', pero tal vez uno sin el archivo . en el nombre

La sintaxis que utilizó funciona bien, si el directorio que busca existe, pero no hay ningún directorio llamado '/client_side/ . '.

Además, tenga cuidado si usa Python 2.x y os.listdir, ya que los resultados en Windows son diferentes cuando usa u'/client_side/' y solo '/client_side'.

schlenk avatar Mar 16 '2013 17:03 schlenk

Puedes hacer solo

os.listdir('client_side')

sin barras.

user2174865 avatar Mar 16 '2013 18:03 user2174865