Использование ОС.walk () для рекурсивного обхода каталогов в 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 - каталоги и остальные файлы.
9 ответов:
Это даст вам желаемый результат
#!/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пакета. Но если вы должны использовать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, и это, вероятно, самое простое решение, но вот еще одна идея для изучения: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()
вы можете распознать следующую документацию из команды TREE в терминале Windows:
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)========вывод ниже========
/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
учитывая имя папки, пройдитесь по всей ее иерархии рекурсивно.
#! /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
Comments