Ошибка при использовании listdir в Python

Я пытаюсь получить список файлов в определенном каталоге и подсчитать количество файлов в каталоге. Я всегда получаю следующую ошибку:

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

Мой код:

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

Я выполнил приведенный ниже пример кода .

Я запускаю Python script на Pyscripter и каталог /client _side/do существует. Мой код python находится в корневой папке и имеет подпапку под названием "client_side". Может кто-нибудь помочь мне в этом?

Ответ 1

Я решил изменить код на:

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

и используйте следующий код:

print numOfFiles("client_side")

Большое спасибо всем, кто рассказал мне, как правильно передать каталог Windows в Python и nrao91 в здесь для предоставления кода функции.

EDIT: Спасибо, eryksun за исправление моего кода!

Ответ 2

Эта ошибка возникает, если вы используете os.listdir по пути, который не относится к существующему пути.
Например:

>>> 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/*.*'

Если вы хотите использовать os.listdir, вам нужно либо гарантировать существование пути, который вы использовали, либо использовать os.path.exists для проверки наличия в первую очередь.

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

Предположим, что ваш текущий рабочий каталог c:\foobar, os.listdir('/client_side/') эквивалентен os.listdir('c:/client_side'), а os.listdir('client_side/') эквивалентен os.listdir('c:/foobar/client_side'). Если ваш каталог client_side не находится в корне, такая ошибка возникает при использовании os.listdir.

Для вашей проблемы с выпуском вспомним os.listdir(path)

Верните список, содержащий имена записей в каталоге, заданном путем. Список находится в произвольном порядке. Он не включает специальные записи '.' и "..", даже если они присутствуют в каталоге.

и os.path.isfile(path).

Вернуть True, если путь - это обычный файл. Это следует за символическими ссылками, поэтому оба islink() и isfile() могут быть истинными для одного и того же пути.

listdir не возвращает ни абсолютные пути, ни относительные пути, а список имен ваших файлов, а isfile - путь. Поэтому все эти имена дадут False.

Чтобы получить путь, мы можем либо использовать os.path.join, напрямую конкатентно две строки.

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

или

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

Ответ 3

Две вещи:

  • os.listdir() не выполняет сопоставление шаблонов glob, используйте glob для этого
  • Возможно, у вас нет каталога с именем '/client_side/*.*', но, возможно, без. в названии

Синтаксис, который вы использовали, отлично работает, если каталог, который вы ищете, существует, но нет каталога с именем '/client_side/.'.

Кроме того, будьте осторожны, если используете Python 2.x и os.listdir, поскольку результаты в окнах различаются при использовании u '/client_side/' и просто '/client_side'.

Ответ 4

Вы можете сделать только

os.listdir('client_side')

без косой черты.

Ответ 5

Как я могу видеть WindowsError, просто интересно, связано ли это с "/" в окнах! В идеале, в окнах, вы должны иметь что-то вроде os.path.join('C:','client_side')

Ответ 6

Вы хотите:

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

с символом "." перед "/client_side/".

Точка означает текущий путь, в котором вы работаете (т.е. от того, где вы вызываете свой код), поэтому "./client_side/" представляет нужный вам путь, который указан относительно вашего текущего каталога.

Если вы пишете только "/client_side/", в unix, программа будет искать папку в корне системы, а не папку, которую вы хотите.

Ответ 7

Если вы просто хотите увидеть все файлы в каталоге, где находится ваш скрипт, вы можете использовать os.path.dirname(sys.argv[0]). Это даст путь к каталогу, в котором находится ваш скрипт.

Затем с помощью функции fnmatch вы можете получить список файлов в этом каталоге с именем и/или расширением, указанным в переменной filename.

import os,sys
from fnmatch import fnmatch

directory = os.path.dirname(sys.argv[0])    #this determines the directory
file_name= "*"                              #if you want the python files only, change "*" to "*.py"

for path, subdirs, files in os.walk(directory):
    for name in files:
        if fnmatch(name, file_name):
            print (os.path.join(path, name))

Надеюсь, это поможет.

Ответ 8

Проверка на существование подлежит гонке. Лучше справиться с ошибкой (просить прощения, а не спрашивать разрешения). Кроме того, в Python 3 вы можете подавлять ошибки. Использовать подавление из contextlib:

 with suppress(FileNotFoundError):
     for name in os.listdir('foo'):
         print(name)