我知道如何进行目录漫步(使用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之间没有空行)。我希望level2中每个目录的列表(即从根目录下降2个级别)由空格分隔。如何在Python中执行此操作?
P.S。列表将非常大,所以我不想手动执行此操作。此外,脚本需要灵活,因此如果需求更改以在级别3(而不是级别2)插入空行,则需要能够处理该行。
答案 0 :(得分: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
)的根开始更改时,它会打印另一个换行符。也许你需要调整它,但想法会类似。
答案 1 :(得分:0)
这是一种做你想做的事情的简单方法。
基本思想是,只要root位于我们希望进行分离的级别,我们就会打印出一行返回。我们可以在删除路径开头的任何'/'
后,在'/'
上拆分根路径来检查这一点。如果有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)