-1

我知道如何进行目录遍历(使用 os.walk)并打印出某个目录中的所有文件。我想要进一步做的是在为某个级别的所有目录打印目录内容之后插入一个空行。为了说明,假设我有这些文件:

/level1/level2a/file1.txt
/level1/level2a/level3a/file2.txt
/level1/level2a/level3b/levle4/file3.txt
/level1/level2b/file4.txt
/level1/level2b/file5.txt

我想将它们打印为:

/level1/level2a/file1.txt
/level1/level2a/level3a/file2.txt
/level1/level2a/level3b/levle4/file3.txt

/level1/level2b/file4.txt
/level1/level2b/file5.txt

请注意,level2a 和 level2b 的列表之间有一个空白行(但 level3a 和 level3b 之间没有空白行)。我希望第 2 级(即从根目录向下 2 级)的每个目录的列表用空格分隔。如何在 Python 中做到这一点?

PS 列表会很大,所以我不想手动执行此操作。此外,脚本需要灵活,因此如果要求更改为在第 3 级(而不是第 2 级)插入空行,它需要能够处理。

4

2 回答 2

0

您可以尝试以下方法。它检查root路径是否超过参数变量中指示的目录级别数(在示例中为硬编码)。在这种情况下,将其保存在d变量中,并将之前的不同保存在prev_d. 然后print以正常方式文件,除非两个变量不同,在这种情况下我将打印一个空行。

内容script.py

import os
import sys

arg_dir_level = 4
prev_d = ''
d = ''

for root, dirs, files in os.walk(sys.argv[1]):

    if root.count(os.sep) >= arg_dir_level:
        d = root.split(os.sep, arg_dir_level+1)[arg_dir_level]

    if prev_d and d and d != prev_d:
        print()

    for file in files:         
        print(os.path.abspath(root + os.sep + file))

    prev_d = d

像这样运行它:

python3 script.py '.'

部分输出是:

/home/birei/python/ENV/lib/python3.3/site-packages/zope.event-4.0.2-py3.3.egg/zope/event/__init__.py
/home/birei/python/ENV/lib/python3.3/site-packages/zope.event-4.0.2-py3.3.egg/zope/event/__pycache__/tests.cpython-33.pyc
/home/birei/python/ENV/lib/python3.3/site-packages/zope.event-4.0.2-py3.3.egg/zope/event/__pycache__/__init__.cpython-33.pyc

/home/birei/python/ENV/lib/python3.3/site-packages/__pycache__/pkg_resources.cpython-33.pyc
/home/birei/python/ENV/lib/python3.3/site-packages/__pycache__/easy_install.cpython-33.pyc

/home/birei/python/ENV/lib/python3.3/site-packages/selenium-2.35.0-py3.3.egg/EGG-INFO/dependency_links.txt
/home/birei/python/ENV/lib/python3.3/site-packages/selenium-2.35.0-py3.3.egg/EGG-INFO/PKG-INFO
/home/birei/python/ENV/lib/python3.3/site-packages/selenium-2.35.0-py3.3.egg/EGG-INFO/not-zip-safe

如您所见,当第四个子目录从我执行脚本 ( ENV) 的根目录开始更改时,它会打印一个额外的换行符。也许你需要调整它,但想法是相似的。

于 2013-09-16T22:51:04.903 回答
0

这是一个简单的方法来做你想做的事。

基本思想是,只要根处于我们想要进行分离的级别,我们就会打印出一行返回。'/'我们可以通过在删除'/'路径开头的任何 s后拆分根路径来检查这一点。如果有level碎片,我们就在正确的位置,应该插入一个换行符。

import os

def do_walk(directory, level=2):
    for root, _, files in os.walk(directory):
        if len(root.lstrip('/').split('/')) == level: 
            print
        for f in files: 
            print os.path.join(root, f)

当然,这确实在开头插入了一个额外的换行符。如果您不希望这样,我建议您这样做:

import os

def do_walk(directory, level=2):
    first = True
    for root, _, files in os.walk(directory):
        if len(root.lstrip('/').split('/')) == level: 
            if first:
                first = False
            else:
                print
        for f in files: 
            print os.path.join(root, f)
于 2013-09-17T01:17:47.750 回答