2013-07-10 55 views
1

的代码,我现在:打印出整个目录树

import os 

Tree = {} 
Tree = os.listdir('Dir') 

>>>print(Tree) 
['New Folder', 'Textfile1.txt', 'Textfile2.txt'] 

这并不打印出子目录中的文件。 (新建文件夹是一个子目录)。

我的问题是,我如何输出目录中的所有文件和子目录中的文件?

+0

阅读文档,看看'os.walk'作品。 –

回答

3
import os 
def Test1(rootDir): 
    list_dirs = os.walk(rootDir) 
    for root, dirs, files in list_dirs: 
     for d in dirs: 
      print os.path.join(root, d)  
     for f in files: 
      print os.path.join(root, f) 

OR:

import os 
def Test2(rootDir): 
    for lists in os.listdir(rootDir): 
     path = os.path.join(rootDir, lists) 
     print path 
     if os.path.isdir(path): 
      Test2(path) 

对于测试文件树:

E:\TEST 
│--A 
│ │--A-A 
│ │ │--A-A-A.txt 
│ │--A-B.txt 
│ │--A-C 
│ │ │--A-B-A.txt 
│ │--A-D.txt 
│--B.txt 
│--C 
│ │--C-A.txt 
│ │--C-B.txt 
│--D.txt 
│--E 

运行下面的代码:

Test1('E:\TEST') 
print '=======================================' 
Test2('E:\TEST') 

你可以看到有结果之间的差异:

>>> 
E:\TEST\A 
E:\TEST\C 
E:\TEST\E 
E:\TEST\B.txt 
E:\TEST\D.txt 
E:\TEST\A\A-A 
E:\TEST\A\A-C 
E:\TEST\A\A-B.txt 
E:\TEST\A\A-D.txt 
E:\TEST\A\A-A\A-A-A.txt 
E:\TEST\A\A-C\A-B-A.txt 
E:\TEST\C\C-A.txt 
E:\TEST\C\C-B.txt 
======================================= 
E:\TEST\A 
E:\TEST\A\A-A 
E:\TEST\A\A-A\A-A-A.txt 
E:\TEST\A\A-B.txt 
E:\TEST\A\A-C 
E:\TEST\A\A-C\A-B-A.txt 
E:\TEST\A\A-D.txt 
E:\TEST\B.txt 
E:\TEST\C 
E:\TEST\C\C-A.txt 
E:\TEST\C\C-B.txt 
E:\TEST\D.txt 
E:\TEST\E 
>>> 

要保存它们的列表:

import os 
files = [] 
def Test1(rootDir): 
    files.append(rootDir) 
    list_dirs = os.walk(rootDir) 
    for root, dirs, files in list_dirs: 
     for d in dirs: 
      files.append(os.path.join(root, d))  
     for f in files: 
      files.append(os.path.join(root, f)) 

import os 
files = [rootDir] 
def Test2(rootDir): 
    for lists in os.listdir(rootDir): 
     path = os.path.join(rootDir, lists) 
     files.append(path) 
     if os.path.isdir(path): 
      Test2(path) 
+0

你可以做到这一点,所以它不打印值,但将它们作为列表返回? – Hendry

+0

所以你只需要文件或文件和dirs? @HendrX – zhangyangyu

+0

文件和dirs。 – Hendry

1

使用:

>>> import os 
>>> print(os.walk.__doc__) 
Directory tree generator. 

    For each directory in the directory tree rooted at top (including top 
    itself, but excluding '.' and '..'), yields a 3-tuple 
    ... 
2

recipe 577091Python Cookbook,您可以使用或与学习TREE仿真器那里。

import sys, os 

FILES = False 

def main(): 
    if len(sys.argv) > 2 and sys.argv[2].upper() == '/F': 
     global FILES; FILES = True 
    try: 
     tree(sys.argv[1]) 
    except: 
     print('Usage: {} <directory>'.format(os.path.basename(sys.argv[0]))) 

def tree(path): 
    path = os.path.abspath(path) 
    dirs, files = listdir(path)[:2] 
    print(path) 
    walk(path, dirs, files) 
    if not dirs: 
     print('No subfolders exist') 

def walk(root, dirs, files, prefix=''): 
    if FILES and files: 
     file_prefix = prefix + ('|' if dirs else ' ') + ' ' 
     for name in files: 
      print(file_prefix + name) 
     print(file_prefix) 
    dir_prefix, walk_prefix = prefix + '+---', prefix + '| ' 
    for pos, neg, name in enumerate2(dirs): 
     if neg == -1: 
      dir_prefix, walk_prefix = prefix + '\\---', prefix + ' ' 
     print(dir_prefix + name) 
     path = os.path.join(root, name) 
     try: 
      dirs, files = listdir(path)[:2] 
     except: 
      pass 
     else: 
      walk(path, dirs, files, walk_prefix) 

def listdir(path): 
    dirs, files, links = [], [], [] 
    for name in os.listdir(path): 
     path_name = os.path.join(path, name) 
     if os.path.isdir(path_name): 
      dirs.append(name) 
     elif os.path.isfile(path_name): 
      files.append(name) 
     elif os.path.islink(path_name): 
      links.append(name) 
    return dirs, files, links 

def enumerate2(sequence): 
    length = len(sequence) 
    for count, value in enumerate(sequence): 
     yield count, count - length, value 

if __name__ == '__main__': 
    main() 
0

Here适合python3另一个版本

输出示例:

pyvarstar/ 
|-- .bashrc 
|-- README 
|-- vstars -> versions/vstars_20170804/ 
|-- versions/ 
|   |-- vstars_20170804/ 
|   |   |-- lib/ 
|   |   |   |-- vstars/ 
|   |   |-- bin/ 
|   |   |   |-- getcoords 
|   |   |   |-- find_burst 

代码:

def realname(path, root=None): 
    if root is not None: 
     path=os.path.join(root, path) 
    result=os.path.basename(path) 
    if os.path.islink(path): 
     realpath=os.readlink(path) 
     result= '%s -> %s' % (os.path.basename(path), realpath) 
    return result 

def ptree(startpath, depth=-1): 
    prefix=0 
    if startpath != '/': 
     if startpath.endswith('/'): startpath=startpath[:-1] 
     prefix=len(startpath) 
    for root, dirs, files in os.walk(startpath): 
     level = root[prefix:].count(os.sep) 
     if depth >-1 and level > depth: continue 
     indent=subindent ='' 
     if level > 0: 
      indent = '| ' * (level-1) + '|-- ' 
     subindent = '| ' * (level) + '|-- ' 
     print('{}{}/'.format(indent, realname(root))) 
     # print dir only if symbolic link; otherwise, will be printed as root 
     for d in dirs: 
      if os.path.islink(os.path.join(root, d)): 
       print('{}{}'.format(subindent, realname(d, root=root))) 
     for f in files: 
      print('{}{}'.format(subindent, realname(f, root=root)))