使用Python的listdir时出错
我想获取一个特定文件夹里的文件列表,并计算这个文件夹里有多少个文件。但我总是遇到以下错误:
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)])
我参考了这里的代码示例。
我在Pyscripter上运行这个Python脚本,而文件夹/client_side/确实存在。我的Python代码在根文件夹里,并且有一个名为“client_side”的子文件夹。有人能帮我解决这个问题吗?
9 个回答
有两件事:
- os.listdir() 这个函数并不支持通配符匹配,如果你想使用通配符,可以用 glob 模块。
- 可能你并没有一个叫 '/client_side/*.*' 的文件夹,但也许有一个名字里没有 . 的文件夹。
你用的语法是没问题的,只要你要找的文件夹确实存在,但没有一个叫 '/client_side/.' 的文件夹。
另外,如果你在用 Python 2.x 和 os.listdir,要小心,因为在 Windows 上使用 u'/client_side/' 和 '/client_side' 得到的结果是不同的。
这个错误发生在你使用 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 的问题,我们可以回顾一下 os.listdir(path)
的说明:
这个函数会返回一个列表,里面包含了指定路径下所有文件和文件夹的名称。这个列表的顺序是随机的。即使目录里有特殊的条目 '.' 和 '..',它们也不会被包含在内。
还有 os.path.isfile(path)
的说明:
如果 path 是一个存在的普通文件,这个函数会返回 True。它会跟随符号链接,所以同一个路径对于
islink()
和isfile()
都可能返回 True。
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)])
我决定把代码改成这样:
def numOfFiles(path):
return len(next(os.walk(path))[2])
然后用下面的方式来调用这个代码:
print numOfFiles("client_side")
非常感谢所有告诉我如何在Python中正确传递Windows目录的人,特别是nrao91,在这里提供了函数代码。