2013-03-16 7 views
9

Я пытаюсь получить список файлов в определенном каталоге и подсчитать количество файлов в каталоге. Я всегда получаю следующее сообщение об ошибке:Ошибка при использовании 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)]) 

Я последовал примеру код, указанный here.

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

+1

Просто интересно, если это имеет какое-то отношение к «/» в окнах! В идеале, в окнах, вы должны иметь что-то вроде 'os.path.join ('C:', 'client_side')' – GodMan

ответ

1

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

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

и используйте после вызова код:

print numOfFiles("client_side") 

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

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

+0

Спасибо! Я забыл о части каталогов. Я обновил свой код соответственно. – Sakura

+1

Добро пожаловать. [ответ nymk] (http://stackoverflow.com/a/15452633/205580) отлично, и я думаю, вы должны принять его как ответ на свой вопрос. – eryksun

1

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

1

Вы хотите:

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

с "" перед «/ client_side /».

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

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

1

Две вещи:

  1. os.listdir() не делает соответствие Глоб узор, использовать glob модуль для этого
  2. вероятно, вы не имеете директорию с именем «/client_side/*.* ', но, возможно, один без . во имя

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

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

+0

. Glob добавляется 'posix.listdir'. В Win32 он использует ['FindFirstFileW'] (http://msdn.microsoft.com/en-us/library/aa364418) (или версию ANSI для байтов). Он не допускает косой черты. Таким образом, вместо специальных корневых каталогов, таких как 'C: \', Python просто добавляет '*. *'. – eryksun

12

Эта ошибка возникает, когда вы используете 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.

Для вашей проблемы 0 Ouput, давайте вспомним os.listdir(path)

Return a list containing the names of the entries in the directory given by path. The list is in arbitrary order. It does not include the special entries '.' and '..' even if they are present in the directory.

и os.path.isfile(path).

Return True if path is an existing regular file. This follows symbolic links, so both islink() and isfile() can be true for the same path.

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)]) 
+0

Привет. У меня сейчас нет ошибок Windows, но он всегда выводит количество файлов как 0, хотя у меня есть 7 файлов в папке. Ты знаешь почему? – Sakura

+0

@Sakura: потому что 'os.listdir' возвращает имена. Вы не должны использовать 'os.path.isfile' для этих имен. Я обновил свой пост и дал полное объяснение. – nymk

+0

@Sakura Вы должны действительно изменить принятый ответ – Antonio

2

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

os.listdir('client_side') 

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

+0

Привет. У меня сейчас нет ошибок Windows, но он всегда выводит количество файлов как 0, хотя у меня есть 7 файлов в папке. Ты знаешь почему? – Sakura

 Смежные вопросы

  • Нет связанных вопросов^_^