仅列出当前目录中的文件


225

在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)这两个文件。

Answers:


378

只需使用os.listdiros.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))

(感谢因果关系的提示)


3
这最终是我需要的[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
citynorman

2
这是他的答案: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet

64

您可以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.


10

您可以使用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()


5

这可以用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中的相关列表,您可以根据需要调整结果。


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


1

您可以使用pathlib模块。

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.