11

我正在尝试获取特定目录中的文件列表并计算目录中的文件数。我总是收到以下错误:

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”的子文件夹。有人可以帮我解决这个问题吗?

4

8 回答 8

14

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'), whileos.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() 对于同一路径都可以为真。

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)])
于 2013-03-16T17:55:29.097 回答
3

我决定将代码更改为:

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

并使用以下调用代码:

print numOfFiles("client_side")

非常感谢所有告诉我如何在 Python 中正确传递 windows 目录的人,以及这里的 nrao91 提供函数代码。

编辑:感谢 eryksun 更正我的代码!

于 2013-03-17T03:52:54.590 回答
2

两件事情:

  1. os.listdir() 不进行 glob 模式匹配,请使用glob模块
  2. 可能您没有名为“/client_side/*.*”的目录,但可能没有. 在名字里

如果您要查找的目录存在,但没有名为 '/client_side/ 的目录,则您使用的语法可以正常工作'。

此外,如果使用 Python 2.x 和 os.listdir,请小心,因为当您使用 u'/client_side/' 和仅使用 '/client_side' 时,Windows 上的结果会有所不同。

于 2013-03-16T17:19:36.050 回答
2

你可以做

os.listdir('client_side')

没有斜线。

于 2013-03-16T18:34:47.067 回答
1

正如我所看到的WindowsError,只是想知道这是否与 Windows 中的“/”有关!理想情况下,在 Windows 上,你应该有类似的东西os.path.join('C:','client_side')

于 2013-03-16T17:16:05.273 回答
1

你要:

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

用“。” 在“/client_side/”之前。

点表示您正在工作的当前路径(即从您调用代码的位置),因此“./client_side/”表示您想要的路径,该路径是相对于您当前目录指定的。

如果您只写“/client_side/”,在 unix 中,程序将在系统根目录中查找文件夹,而不是您想要的文件夹。

于 2013-03-16T17:19:06.270 回答
0

如果您只想查看脚本所在目录中的所有文件,可以使用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))

我希望这有帮助。

于 2019-03-05T18:03:00.220 回答
0

检查是否存在取决于比赛。更好地处理错误(请求宽恕而不是请求许可)。另外,在 Python 3 中,您可以抑制错误。使用 contextlib 中的抑制:

 with suppress(FileNotFoundError):
     for name in os.listdir('foo'):
         print(name)
于 2019-09-06T23:25:04.220 回答