Using os.walk() to recursively traverse directories in Python
我想从根目录导航到其中的所有其他目录并打印相同的目录。
以下是我的代码:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/python import os import fnmatch for root, dir, files in os.walk("."): print root print"" for items in fnmatch.filter(files,"*"): print"..." + items print"" |
这是我的门诊部:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | . ...Python_Notes ...pypy.py ...pypy.py.save ...classdemo.py ....goutputstream-J9ZUXW ...latest.py ...pack.py ...classdemo.pyc ...Python_Notes~ ...module-demo.py ...filetype.py ./packagedemo ...classdemo.py ...__init__.pyc ...__init__.py ...classdemo.pyc |
上面,
但是,我需要按以下方式打印O/P:
1 2 3 4 5 | A ---a.txt ---b.txt ---B ------c.out |
上面,
这将给您期望的结果
1 2 3 4 5 6 7 8 9 10 | #!/usr/bin/python import os # traverse root directory, and list directories as dirs and files as files for root, dirs, files in os.walk("."): path = root.split(os.sep) print((len(path) - 1) * '---', os.path.basename(root)) for file in files: print(len(path) * '---', file) |
试试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #!/usr/bin/env python # -*- coding: utf-8 -*- """FileTreeMaker.py: ...""" __author__ ="legendmohe" import os import argparse import time class FileTreeMaker(object): def _recurse(self, parent_path, file_list, prefix, output_buf, level): if len(file_list) == 0 \ or (self.max_level != -1 and self.max_level <= level): return else: file_list.sort(key=lambda f: os.path.isfile(os.path.join(parent_path, f))) for idx, sub_path in enumerate(file_list): if any(exclude_name in sub_path for exclude_name in self.exn): continue full_path = os.path.join(parent_path, sub_path) idc ="┣━" if idx == len(file_list) - 1: idc ="┗━" if os.path.isdir(full_path) and sub_path not in self.exf: output_buf.append("%s%s[%s]" % (prefix, idc, sub_path)) if len(file_list) > 1 and idx != len(file_list) - 1: tmp_prefix = prefix +"┃ " else: tmp_prefix = prefix +" " self._recurse(full_path, os.listdir(full_path), tmp_prefix, output_buf, level + 1) elif os.path.isfile(full_path): output_buf.append("%s%s%s" % (prefix, idc, sub_path)) def make(self, args): self.root = args.root self.exf = args.exclude_folder self.exn = args.exclude_name self.max_level = args.max_level print("root:%s" % self.root) buf = [] path_parts = self.root.rsplit(os.path.sep, 1) buf.append("[%s]" % (path_parts[-1],)) self._recurse(self.root, os.listdir(self.root),"", buf, 0) output_str =" ".join(buf) if len(args.output) != 0: with open(args.output, 'w') as of: of.write(output_str) return output_str if __name__ =="__main__": parser = argparse.ArgumentParser() parser.add_argument("-r","--root", help="root of file tree", default=".") parser.add_argument("-o","--output", help="output file name", default="") parser.add_argument("-xf","--exclude_folder", nargs='*', help="exclude folder", default=[]) parser.add_argument("-xn","--exclude_name", nargs='*', help="exclude name", default=[]) parser.add_argument("-m","--max_level", help="max level", type=int, default=-1) args = parser.parse_args() print(FileTreeMaker().make(args)) |
您将得到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | root:. [.] ┣━[.idea] ┃ ┣━[scopes] ┃ ┃ ┗━scope_settings.xml ┃ ┣━.name ┃ ┣━Demo.iml ┃ ┣━encodings.xml ┃ ┣━misc.xml ┃ ┣━modules.xml ┃ ┣━vcs.xml ┃ ┗━workspace.xml ┣━[test1] ┃ ┗━test1.txt ┣━[test2] ┃ ┣━[test2-2] ┃ ┃ ┗━[test2-3] ┃ ┃ ┣━test2 ┃ ┃ ┗━test2-3-1 ┃ ┗━test2 ┣━folder_tree_maker.py ┗━tree.py |
在
1 2 3 4 5 6 7 8 9 10 | def walkdir(dirname): for cur, _dirs, files in os.walk(dirname): pref = '' head, tail = os.path.split(cur) while head: pref += '---' head, _tail = os.path.split(head) print(pref+tail) for f in files: print(pref+'---'+f) |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> walkdir('.') . ---file3 ---file2 ---my.py ---file1 ---A ------file2 ------file1 ---B ------file3 ------file2 ------file4 ------file1 ---__pycache__ ------my.cpython-33.pyc |
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 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() |
您可以通过Windows终端中的tree命令识别以下文档:
1 2 3 4 5 6 | Graphically displays the folder structure of a drive or path. TREE [drive:][path] [/F] [/A] /F Display the names of the files in each folder. /A Use ASCII instead of extended characters. |
这适用于文件夹名:
1 2 3 4 5 6 7 8 9 | def printFolderName(init_indent, rootFolder): fname = rootFolder.split(os.sep)[-1] root_levels = rootFolder.count(os.sep) # os.walk treats dirs breadth-first, but files depth-first (go figure) for root, dirs, files in os.walk(rootFolder): # print the directories below the root levels = root.count(os.sep) - root_levels indent = ' '*(levels*2) print init_indent + indent + root.split(os.sep)[-1] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/python import os def tracing(a): global i> for item in os.listdir(a): if os.path.isfile(item): print i + item else: print i + item i+=i tracing(item) i ="---" tracing(".") |
给定一个文件夹名,递归地遍历它的整个层次结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #! /usr/local/bin/python3 # findLargeFiles.py - given a folder name, walk through its entire hierarchy # - print folders and files within each folder import os def recursive_walk(folder): for folderName, subfolders, filenames in os.walk(folder): if subfolders: for subfolder in subfolders: recursive_walk(subfolder) print(' Folder: ' + folderName + ' ') for filename in filenames: print(filename + ' ') recursive_walk('/name/of/folder') |
试试这个;简单一点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/usr/bin/python import os # Creating an empty list that will contain the already traversed paths donePaths = [] def direct(path): for paths,dirs,files in os.walk(path): if paths not in donePaths: count = paths.count('/') if files: for ele1 in files: print '---------' * (count), ele1 if dirs: for ele2 in dirs: print '---------' * (count), ele2 absPath = os.path.join(paths,ele2) # recursively calling the direct function on each directory direct(absPath) # adding the paths to the list that got traversed donePaths.append(absPath) path = raw_input("Enter any path to get the following Dir Tree ... ") direct(path) |
==输出低于==
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /home/test ------------------ b.txt ------------------ a.txt ------------------ a --------------------------- a1.txt ------------------ b --------------------------- b1.txt --------------------------- b2.txt --------------------------- cde ------------------------------------ cde.txt ------------------------------------ cdeDir --------------------------------------------- cdeDir.txt ------------------ c --------------------------- c.txt --------------------------- c1 ------------------------------------ c1.txt ------------------------------------ c2.txt |
递归遍历一个目录,从当前目录中的所有目录中获取所有文件,然后从当前目录中获取所有目录,因为上面的代码并不简单(imho):
1 2 3 4 5 | for root, dirs, files in os.walk(rootFolderPath): for filename in files: doSomethingWithFile(os.path.join(root, filename)) for dirname in dirs: doSomewthingWithDir(os.path.join(root, dirname)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import os os.chdir('/your/working/path/') dir = os.getcwd() list = sorted(os.listdir(dir)) marks ="" for s_list in list: print marks + s_list marks +="---" tree_list = sorted(os.listdir(dir +"/" + s_list)) for i in tree_list: print marks + i |