仅列出当前目录中的文件

时间:2012-08-15 12:07:21

标签: python

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

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

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

假设我的当前目录中有2个文件,holygrail.py和Tim。我有一个文件夹,它包含两个文件 - 让我们称之为亚瑟和兰斯洛特 - 在里面。当我运行脚本时,这就是我得到的:

holygrail.py
Tim
Arthur
Lancelot

我对holygrail.py和蒂姆很满意。但是这两个文件,Arthur和Lancelot,我不想列出。

9 个答案:

答案 0 :(得分:307)

只需使用os.listdiros.path.isfile代替os.walk

示例:

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

(感谢Causality提示)

答案 1 :(得分:54)

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

答案 2 :(得分:13)

import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

答案 3 :(得分:6)

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

import os

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

os.listdir()更快。 os.walk() implements os.scandir()

答案 4 :(得分:4)

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

您可以使用pathlib模块。

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))

答案 8 :(得分:-4)

我的解决方案是:

import re
p = re.compile('[a-z]+', re.IGNORECASE)
words = p.findall("Hello, world! I'm a coder")

我认为这个解决方案更好