仅列出当前目录中的文件

sla*_*can 202 python

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

似乎有类似的解决方案,但它们似乎并不适合我.这是我的代码片段:

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

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

holygrail.py
Tim
Arthur
Lancelot
Run Code Online (Sandbox Code Playgroud)

我对holygrail.py和蒂姆很满意.但这两个档案,亚瑟和兰斯洛特,我不想上市.

slo*_*oth 339

只需使用os.listdiros.path.isfile不是os.walk.

例:

files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something
Run Code Online (Sandbox Code Playgroud)

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

files = [f for f in os.listdir(somedir) if os.path.isfile(f)].
Run Code Online (Sandbox Code Playgroud)

哪个不起作用,因为f它不是一个完整的路径,而是相对于当前的目录.

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

(感谢提示的因果关系)

  • 这就是我最终需要的`[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]` (7认同)
  • 这是他的答案:`files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'` (4认同)

mgi*_*son 56

你可以用它os.listdir来达到这个目的.如果您只想要文件而不是目录,则可以使用过滤结果os.path.isfile.

例:

files = os.listdir(os.curdir)  #files and directories
Run Code Online (Sandbox Code Playgroud)

要么

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.
Run Code Online (Sandbox Code Playgroud)


小智 15

import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供一般解决方案(在dir不是cwd的情况下)。 (2认同)

pra*_*adi 9

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

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)
Run Code Online (Sandbox Code Playgroud)

比...更快os.listdir().os.walk() 实施 os.scandir().


211*_*4L3 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)
Run Code Online (Sandbox Code Playgroud)

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

更新参考

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

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

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


小智 5

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

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

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

或者如果您可以将 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
Run Code Online (Sandbox Code Playgroud)


Pyg*_*irl 5

您可以使用 pathlib 模块。

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