使用os.walk()以recursion方式遍历Python中的目录
我想从根目录导航到其他所有目录,并打印相同的目录。
这是我的代码:
#!/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 ""
这是我的O / P:
. ...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
上面, .
和./packagedemo
是目录。
但是,我需要按以下方式打印O / P:
A ---a.txt ---b.txt ---B ------c.out
上面, A
和B
是目录,其余的是文件。
这会给你想要的结果
#!/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)
尝试这个:
#!/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 = "\n".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))
你会得到这个:
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
os
包中有更适合的function。 但是,如果你不得不使用os.walk
,这是我想出的
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)
输出:
>>> walkdir('.') . ---file3 ---file2 ---my.py ---file1 ---A ------file2 ------file1 ---B ------file3 ------file2 ------file4 ------file1 ---__pycache__ ------my.cpython-33.pyc
你可以使用os.walk
,这可能是最简单的解决scheme,但这里有另外一个想法:
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()
您可能会从Windowsterminal的TREE命令中识别以下文档:
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.
这是为文件夹名称:
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]
#!/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(".")
试试这个; 容易一个
#!/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 ...\n") direct(path)
======== OUTPUT下面========
/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
给定文件夹名称,recursion遍历整个层次结构。
#! /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('\nFolder: ' + folderName + '\n') for filename in filenames: print(filename + '\n') recursive_walk('/name/of/folder')
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