286

在 Python 中,我只想列出当前目录中的所有文件。我不希望从任何子目录或父目录中列出文件。

那里似乎确实有类似的解决方案,但它们似乎对我不起作用。这是我的代码片段:

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

假设我的当前目录中有 2 个文件,holygrail.py 和 Tim。我也有一个文件夹,其中包含两个文件——我们称它们为 Arthur 和 Lancelot——在里面。当我运行脚本时,这就是我得到的:

holygrail.py
Tim
Arthur
Lancelot

我对 Holygrail.py 和 Tim 很满意。但是我不想列出 Arthur 和 Lancelot 这两个文件。

4

8 回答 8

478

只需使用os.listdirandos.path.isfile而不是os.walk.

例子:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

但是在将其应用于其他目录时要小心,例如

files = [f for f in os.listdir(somedir) if os.path.isfile(f)].

这不起作用,因为f它不是完整路径,而是相对于当前目录。

因此,要过滤另一个目录,请执行os.path.isfile(os.path.join(somedir, f))

(感谢因果的提示)

于 2012-08-15T12:09:55.920 回答
81

您可以os.listdir用于此目的。如果您只想要文件而不是目录,您可以使用os.path.isfile.

例子:

files = os.listdir(os.curdir)  #files and directories

或者

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.
于 2012-08-15T12:09:25.503 回答
26
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
于 2014-06-10T09:39:29.810 回答
13

您可以使用os.scandir(). stdlib 中的新函数从 Python 3.5 开始。

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

比 快os.listdir()os.walk() 实现 os.scandir()

于 2016-10-24T10:37:19.807 回答
9

您可以使用该pathlib模块。

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
于 2019-11-08T17:46:30.817 回答
7

这可以通过 os.walk() 来完成

python 3.5.2 测试;

import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

删除 dirs.clear() 行并再次包含子文件夹中的文件。

更新参考资料

os.walk记录在这里并讨论正在创建的三重列表和自上而下的效果。

.clear()在此处记录用于清空列表

因此,通过从 os.walk 中清除相关列表,您可以根据您的需要影响其结果。

于 2016-09-24T13:34:35.777 回答
4

而不是os.walk,只需使用os.listdir

于 2012-08-15T12:09:15.487 回答
4
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

您可以改进此代码,del dirs[:]如下所示。

import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

如果您可以将 os.walk 指向当前工作目录,甚至更好。

import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file
于 2018-02-25T15:09:11.360 回答