Ошибка при использовании 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)