首页 文章

Python中的目录树列表

提问于
浏览
520

如何获取Python中给定目录中所有文件(和目录)的列表?

21 回答

  • 0

    这是遍历目录树中每个文件和目录的方法:

    import os
    
    for dirname, dirnames, filenames in os.walk('.'):
        # print path to all subdirectories first.
        for subdirname in dirnames:
            print(os.path.join(dirname, subdirname))
    
        # print path to all filenames.
        for filename in filenames:
            print(os.path.join(dirname, filename))
    
        # Advanced usage:
        # editing the 'dirnames' list will stop os.walk() from recursing into there.
        if '.git' in dirnames:
            # don't go into any .git directories.
            dirnames.remove('.git')
    
  • 502

    您可以使用

    os.listdir(path)
    

    有关参考和更多os函数,请查看此处:

  • 80

    这是我经常使用的辅助函数:

    import os
    
    def listdir_fullpath(d):
        return [os.path.join(d, f) for f in os.listdir(d)]
    
  • 9
    import os
    
    for filename in os.listdir("C:\\temp"):
        print  filename
    
  • 5

    如果你需要通配能力,那么也有一个模块 . 例如:

    import glob
    glob.glob('./[0-9].*')
    

    将返回如下内容:

    ['./1.gif', './2.txt']
    

    请参阅文档here .

  • 7

    试试这个:

    import os
    for top, dirs, files in os.walk('./'):
        for nm in files:       
            print os.path.join(top, nm)
    
  • 0

    对于当前工作目录中的文件而不指定路径

    Python 2.7:

    import os
    os.listdir(os.getcwd())
    

    Python 3.x:

    import os
    os.listdir()
    

    感谢Stam Kaly对python 3.x的评论

  • 89

    递归实现

    import os
    
    def scan_dir(dir):
        for name in os.listdir(dir):
            path = os.path.join(dir, name)
            if os.path.isfile(path):
                print path
            else:
                scan_dir(path)
    
  • 2

    我写了一个很长的版本,包含了我可能需要的所有选项:http://sam.nipl.net/code/python/find.py

    我想它也适合这里:

    #!/usr/bin/env python
    
    import os
    import sys
    
    def ls(dir, hidden=False, relative=True):
        nodes = []
        for nm in os.listdir(dir):
            if not hidden and nm.startswith('.'):
                continue
            if not relative:
                nm = os.path.join(dir, nm)
            nodes.append(nm)
        nodes.sort()
        return nodes
    
    def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
        root = os.path.join(root, '')  # add slash if not there
        for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
            if relative:
                parent = parent[len(root):]
            if dirs and parent:
                yield os.path.join(parent, '')
            if not hidden:
                lfiles   = [nm for nm in lfiles if not nm.startswith('.')]
                ldirs[:] = [nm for nm in ldirs  if not nm.startswith('.')]  # in place
            if files:
                lfiles.sort()
                for nm in lfiles:
                    nm = os.path.join(parent, nm)
                    yield nm
    
    def test(root):
        print "* directory listing, with hidden files:"
        print ls(root, hidden=True)
        print
        print "* recursive listing, with dirs, but no hidden files:"
        for f in find(root, dirs=True):
            print f
        print
    
    if __name__ == "__main__":
        test(*sys.argv[1:])
    
  • 583

    一个漂亮的衬垫,只递归列出文件 . 我在setup.py package_data指令中使用了这个:

    import os
    
    [os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]
    

    我知道这不是问题的答案,但可能派上用场

  • 1

    对于Python 2

    #!/bin/python2
    
    import os
    
    def scan_dir(path):
        print map(os.path.abspath, os.listdir(pwd))
    

    对于Python 3

    对于过滤器和 Map ,您需要用list()包装它们

    #!/bin/python3
    
    import os
    
    def scan_dir(path):
        print(list(map(os.path.abspath, os.listdir(pwd))))
    

    现在的建议是用生成器表达式或列表推导替换你对map和filter的使用:

    #!/bin/python
    
    import os
    
    def scan_dir(path):
        print([os.path.abspath(f) for f in os.listdir(path)])
    
  • 0

    这是一行Pythonic版本:

    import os
    dir = 'given_directory_name'
    filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]
    

    此代码列出给定目录名中所有文件和目录的完整路径 .

  • 1
    #import modules
    import os
    
    _CURRENT_DIR = '.'
    
    
    def rec_tree_traverse(curr_dir, indent):
        "recurcive function to traverse the directory"
        #print "[traverse_tree]"
    
        try :
            dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
        except:
            print "wrong path name/directory name"
            return
    
        for file_or_dir in dfList:
    
            if os.path.isdir(file_or_dir):
                #print "dir  : ",
                print indent, file_or_dir,"\\"
                rec_tree_traverse(file_or_dir, indent*2)
    
            if os.path.isfile(file_or_dir):
                #print "file : ",
                print indent, file_or_dir
    
        #end if for loop
    #end of traverse_tree()
    
    def main():
    
        base_dir = _CURRENT_DIR
    
        rec_tree_traverse(base_dir," ")
    
        raw_input("enter any key to exit....")
    #end of main()
    
    
    if __name__ == '__main__':
        main()
    
  • 0

    仅供参考添加扩展名或ext文件导入操作系统的过滤器

    path = '.'
    for dirname, dirnames, filenames in os.walk(path):
        # print path to all filenames with extension py.
        for filename in filenames:
            fname_path = os.path.join(dirname, filename)
            fext = os.path.splitext(fname_path)[1]
            if fext == '.py':
                print fname_path
            else:
                continue
    
  • 0
    import os, sys
    
    #open files in directory
    
    path = "My Documents"
    dirs = os.listdir( path )
    
    # print the files in given directory
    
    for file in dirs:
       print (file)
    
  • 1

    如果想的话我会把它扔进去 . 简单而肮脏的方式来做通配符搜索 .

    import re
    import os
    
    [a for a in os.listdir(".") if re.search("^.*\.py$",a)]
    
  • 0

    下面的代码将列出目录和目录中的文件

    def print_directory_contents(sPath):
            import os                                       
            for sChild in os.listdir(sPath):                
                sChildPath = os.path.join(sPath,sChild)
                if os.path.isdir(sChildPath):
                    print_directory_contents(sChildPath)
                else:
                    print(sChildPath)
    
  • 0

    我知道这是一个老问题 . 如果你在liunx机器上,这是我遇到的一种巧妙的方式 .

    import subprocess
    print(subprocess.check_output(["ls", "/"]).decode("utf8"))
    
  • 12

    与我合作的那个是Saleh上面的一个修改版本 .

    代码如下:

    对于os.listdir(dir)中的i,“dir ='given_directory_name'filenames = [os.path.abspath(os.path.join(dir,i))”

  • 0

    这是另一种选择 .

    os.scandir(path='.')
    

    它返回os.DirEntry对象的迭代器,该对象对应于path给出的目录中的条目(以及文件属性信息) .

    例:

    with os.scandir(path) as it:
        for entry in it:
            if not entry.name.startswith('.'):
                print(entry.name)
    

    Using scandir() instead of listdir() can significantly increase the performance of code that also needs file type or file attribute information ,因为os.DirEntry对象在操作系统扫描目录时提供此信息 . 所有os.DirEntry方法都可以执行系统调用,但是is_dir()和is_file()通常只需要对符号链接进行系统调用; os.DirEntry.stat()总是需要在Unix上进行系统调用,但在Windows上只需要一个符号链接 .

    Python Docs

  • 0

    虽然 os.listdir() 适用于生成文件和目录名称列表,但是一旦你拥有这些名称,你经常需要做更多的事情 - 而在Python3中,pathlib使其他家务变得简单 . 我们来看看你是否喜欢它 .

    要列出dir内容,请构造Path对象并获取迭代器:

    In [16]: Path('/etc').iterdir()
    Out[16]: <generator object Path.iterdir at 0x110853fc0>
    

    如果我们只想要一个名单列表:

    In [17]: [x.name for x in Path('/etc').iterdir()]
    Out[17]:
    ['emond.d',
     'ntp-restrict.conf',
     'periodic',
    

    如果你只想要dirs:

    In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
    Out[18]:
    ['emond.d',
     'periodic',
     'mach_init.d',
    

    如果您想要该树中所有conf文件的名称:

    In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
    Out[20]:
    ['ntp-restrict.conf',
     'dnsextd.conf',
     'syslog.conf',
    

    如果您想要树> = 1K中的conf文件列表:

    In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
    Out[23]:
    ['dnsextd.conf',
     'pf.conf',
     'autofs.conf',
    

    解决相对路径变得容易:

    In [32]: Path('../Operational Metrics.md').resolve()
    Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')
    

    使用Path导航非常清楚(尽管出乎意料):

    In [10]: p = Path('.')
    
    In [11]: core = p / 'web' / 'core'
    
    In [13]: [x for x in core.iterdir() if x.is_file()]
    Out[13]:
    [PosixPath('web/core/metrics.py'),
     PosixPath('web/core/services.py'),
     PosixPath('web/core/querysets.py'),
    

相关问题