关于python:仅列出当前目录中的文件

List files ONLY in the current directory

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

似乎有类似的解决方案,但他们似乎不适合我。这是我的代码段:

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

假设我在当前目录中有两个文件,holygrail.py和tim。我也有一个文件夹,里面有两个文件,我们叫他们亚瑟和兰斯洛特。当我运行脚本时,我得到的是:

1
2
3
4
holygrail.py
Tim
Arthur
Lancelot

我对HolyGrail.py和Tim很满意。但这两份文件,亚瑟和兰斯洛特,我不想列出。


os.listdiros.path.isfile代替os.walk

例子:

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

但是在将这个应用到其他目录时要小心,比如

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

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

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

(感谢因果关系的提示)


为此,您可以使用os.listdir。如果只需要文件而不需要目录,可以使用os.path.isfile筛选结果。

例子:

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

1
2
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.


1
2
3
4
5
import os

destdir = '/var/tmp/testdir'

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


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

1
2
3
4
5
import os

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

os.listdir()快。os.walk()执行os.scandir()


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

python 3.5.2测试;

1
2
3
4
5
6
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中清除相关列表,您可以根据自己的需要来影响其结果。


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

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

1
2
3
4
5
6
import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

或者更好,如果您可以用当前工作目录指向os.walk。

1
2
3
4
5
6
7
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


不用os.walk,只要用os.listdir


我的解决方案是:

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

我觉得这个办法更好