Error al usar listdir en Python
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?
Este error ocurre cuando utiliza os.listdir
una 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.exists
para 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.
listdir
no devuelve ni las rutas absolutas ni las relativas, sino una lista del nombre de sus archivos, mientras que isfile
requiere la ruta. Por lo tanto, todos esos nombres darían lugar False
.
Para obtener la ruta, podemos usar o os.path.join
conectar 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)])
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.
Dos cosas:
- os.listdir() no hace una comparación de patrones globales, use el módulo global para eso
- 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'.
Puedes hacer solo
os.listdir('client_side')
sin barras.