我想从根目录导航到所有其他目录,并打印相同的内容。

这是我的代码:

#!/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是目录。

不过,我需要以下列方式列印订单:

A
---a.txt
---b.txt
---B
------c.out

上面,A和B是目录,其余是文件。


当前回答

试试这个:

import os
root_name = next(os.walk("."))[0]
dir_names = next(os.walk("."))[1]
file_names = next(os.walk("."))[2]

这里我假设您的路径为“.”,其中有root_file和其他目录。 因此,基本上我们只是通过使用next()调用来遍历树,作为我们的os。行走只是生成函数。 通过这样做,我们可以将所有的目录和文件名分别保存在dir_names和file_names中。

其他回答

在os包中有更适合的函数。但是如果你必须使用操作系统。走吧,这是我想到的

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。步行,这可能是最简单的解决方案,但这里有另一个值得探索的想法:

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命令中识别出以下文档:

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.

试试这个:

import os
root_name = next(os.walk("."))[0]
dir_names = next(os.walk("."))[1]
file_names = next(os.walk("."))[2]

这里我假设您的路径为“.”,其中有root_file和其他目录。 因此,基本上我们只是通过使用next()调用来遍历树,作为我们的os。行走只是生成函数。 通过这样做,我们可以将所有的目录和文件名分别保存在dir_names和file_names中。

假设你有一个任意的父目录,子目录如下:

/home/parent_dir
├── 0_N
├── 1_M
├── 2_P
├── 3_R
└── 4_T

下面是你可以估计每个子目录中#文件相对于父目录中#文件总数的大致百分比:

from os import listdir as osl
from os import walk as osw
from os.path import join as osj

def subdir_summary(parent_dir):
    parent_dir_len = sum([len(files) for _, _, files in osw(parent_dir)])
    print(f"Total files in parent: {parent_dir_len}")
    for subdir in sorted(osl(parent_dir)):
        subdir_files_len = len(osl(osj(parent_dir, subdir)))
        print(subdir, subdir_files_len, f"{int(100*(subdir_files_len / parent_dir_len))}%")

subdir_summary("/home/parent_dir")

它将在终端中打印如下:

Total files in parent: 5876
0_N 3254 55%
1_M 509 8%
2_P 1187 20%
3_R 594 10%
4_T 332 5%

这是最好的办法吗

import os

def traverse_dir_recur(directory):
    l = os.listdir(directory)
    for d in l:
        if os.path.isdir(directory + d):
            traverse_dir_recur(directory +  d +"/")
        else:
            print(directory + d)