Python中使用listdir时出现错误。

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”的子文件夹。有人可以帮帮我吗?


2
我在想这是否与Windows中的'/'有关!理想情况下,在Windows上,您应该有类似于os.path.join('C:','client_side')的东西。 - GodMan
这个回答解决了你的问题吗?Python为os.listdir返回的文件名引发FileNotFoundError - mkrieger1
9个回答

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'),而os.listdir('client_side/')等同于os.listdir('c:/foobar/client_side')。如果您的client_side目录不在根目录下,在使用os.listdir时会出现错误。
对于你的0输出问题,让我们回想一下os.listdir(path) 它会返回一个列表,其中包含路径为path的目录中文件名的列表。该列表是任意排列的,不包括特殊条目“.”和“..”,即使它们存在于目录中。
还有os.path.isfile(path):
如果

嗨。我现在没有任何Windows错误,但它总是输出文件数量为0,尽管我在文件夹中有7个文件。你知道为什么吗? - Sakura
@Sakuraпјҡеӣ дёәos.listdirиҝ”еӣһзҡ„жҳҜеҗҚз§°пјҢжүҖд»ҘдҪ дёҚеә”иҜҘеңЁиҝҷдәӣеҗҚз§°дёҠдҪҝз”Ёos.path.isfileгҖӮжҲ‘жӣҙж–°дәҶжҲ‘зҡ„её–еӯҗ并з»ҷеҮәдәҶе®Ңж•ҙзҡ„и§ЈйҮҠгҖӮ - nymk
@Sakura 你应该真正改变已接受的答案。 - Antonio
一般来说,对于操作系统的操作,最好使用try except而不是if else,因为可能会同时进行其他文件操作。例如:try: os.listdir('/client_side/') except os.error: print("error listing directory") - Charles Lin

3
我决定将代码改成:
def numOfFiles(path):
    return len(next(os.walk(path))[2])

使用以下代码进行调用:
print numOfFiles("client_side")

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

谢谢!我忘记了目录部分。我已经相应地更新了我的代码。 - Sakura
1
不用客气。nymk的回答非常出色,我认为你应该接受它作为你问题的答案。 - Eryk Sun

2
你可以仅进行以下操作:
os.listdir('client_side')

不带斜杠。


嗨。我现在没有任何Windows错误,但它总是输出文件数量为0,尽管我在文件夹中有7个文件。你知道为什么吗? - Sakura

2

有两件事:

  1. os.listdir()并不支持glob模式匹配,需要使用glob模块来实现
  2. 你可能没有名为'/client_side/*.*'的目录, 但也许是没有名称中包含.的目录

如果你要查找的目录存在,那么你所使用的语法就可以正常工作,但是不存在名为'/client_side/.'的目录。

另外,在使用Python 2.x和os.listdir时要小心,因为在Windows上使用u'/client_side/'和'/client_side'会得到不同的结果。


posix.listdir 函数会添加 glob。在 Win32 中,它使用 FindFirstFileW(或字节的 ANSI 版本)。它不允许以斜杠结尾。因此,Python 不会特殊处理根目录,如 C:\,而是只是附加 *.* - Eryk Sun

1
你想要:
print len([name for name in os.listdir('./client_side/') if os.path.isfile(name)])

在“/client_side/”之前加上“.”。
这个点表示你正在工作的当前路径(即你调用代码的位置),因此“./client_side/”代表你想要的路径,相对于你当前的目录来指定。
如果你只写“/client_side/”,在unix系统中,程序会在系统根目录中查找一个文件夹,而不是你想要的文件夹。

1
我看到了一个WindowsError,不知道这是否与Windows中的'/'有关!理想情况下,在Windows上,您应该有类似于os.path.join('C:','client_side')的东西。

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))

希望这能有所帮助。


0

检查存在性可能会出现竞争状况。最好处理错误(宁可请求原谅,而不是事先征得许可)。此外,在Python 3中,您可以抑制错误。使用contextlib中的suppress:

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

-1
如果你可能正在使用Pycharm或任何类型的IDE,请考虑错误地指定工作目录的可能性。
祝你有一个愉快的一天。

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接