Python在循环

时间:2015-11-24 17:46:57

标签: python replace conditional placeholder substitution

这可能令人困惑。

rootdir= C:\User\Desktop\File
file = 'file.txt'

mainLocNum = str(list(rootdir)).count(r'\\')
mainFolder=os.listdir(rootdir)

with open(file,'w') as f:

    for dir, subdirs, files in os.walk(rootdir):
        currentDirLevel=str(list(dir)).count(r'\\')
        for allFolders in subdirs:
            if (currentDirLevel - mainLocNum) == 0:
                parentFolders=allFolders
                f.write(str(parentFolders))
                PLACEHOLDER
            elif (currentDirLevel - mainLocNum) == 1:
                subFolders=allFolders
                f.write(str(allFolders)     <----- write this in PLACEHOLDER

我希望仅在满足write条件时才将第二个PLACEHOLDER语句写入elif行。如果我没有在write位置写第二个PLACEHOLDER语句,则第二个条件中的第二个write语句将写在文本文件的最底部;但是我想在write位置编写第二个条件的PLACEHOLDER语句(仅当它满足时),该位置位于每个第一次write次迭代之间。

我一直在尝试不同的嵌套方法,但我缺乏基本的循环构造逻辑。

感谢任何帮助,谢谢!

编辑:

我正在遍历主目录,我正在将所有父文件夹写入文本文件。我想在每个父文件夹之间写下它的子文件夹:即如果父文件夹包含更多文件夹,则在每个父文件夹之间写入这些文件夹;如果父文件夹不包含任何其他文件夹,则跳到下一个父文件夹等。我使用if(currentDirLevel - mainLocNum)==(数字)来知道它进入的目录数量和执行不同的目录为每一步写入函数。

我试图以某些格式写出文件夹的名称,具体取决于它们是1级子目录,2级子目录等......

我想要的是什么:

ParentFolder1
    SubFolder1
    Subfolder2
        SubSubFolder1
    SubFolder3
ParentFolder2
    SubFolder1
ParentFolder3
ParentFolder4
    SubFolder1
        SubSubFolder1
            SubSubSubFolder1
        SubSubFolder2
    SubFolder2
ParentFolder5
    SubFolder1

我得到的是什么

ParentFolder1
ParentFolder2
ParentFolder3
ParentFolder4
ParentFolder5
SubFolder1
SubFolder2
SubFolder3
SubFolder1
SubFolder1
SubFolder2
SubFolder1
SubSubFolder1
SubSubFolder1
SubSubFolder2
SubSubSubFolder1

请不要专注于os.walk或遍历目录。我已经编写了很多代码,我希望主要关注的是回答我关于运行条件循环并将该循环中的值放入另一个循环内的写函数的问题。

我更喜欢重构这个循环逻辑,而不是重新开始使用整个os.walk for循环。

再次感谢

1 个答案:

答案 0 :(得分:3)

我不太清楚你所说的“条件循环”是什么意思,但你想要实现的是使用基于os.listdir的小递归函数轻松完成的。您可以使用os.walk执行此操作,但我经常发现在os.listdir内部os.walk调用os.listdir更简单(也更有效) ),特别是当你不需要单独的目录列表和普通文件时。

import os

tab = 4 * ' '

def writedirs(fhandle, path, depth=0):
    ''' Recursively walk the directory tree starting at path,
        writing all directory names to open file handle fhandle.
        Nodes are traversed depth-first, top-down, and names
        are indented proportional to their depth.
    '''
    data = os.listdir(path)
    # Names returned by listdir are in file system order;
    # If you want them sorted alphabetically, call
    # data.sort()
    # or
    # data.sort(key=str.lower)
    # for case-insensitive sorting.

    indent = depth * tab
    depth += 1
    for filename in data:
        fullpath = os.path.join(path, filename)
        if os.path.isdir(fullpath):
            fhandle.write(indent + filename + '\n')
            writedirs(fhandle, fullpath, depth)

#Test
rootdir = 'testfolder'
outname = 'file.txt'
with open(outname, 'w') as fhandle:
    writedirs(fhandle, rootdir)

'file.txt'的内容

ParentFolder1
    SubFolder1
    Subfolder2
        SubSubFolder1
    SubFolder3
ParentFolder2
    SubFolder1
ParentFolder3
ParentFolder4
    SubFolder1
        SubSubFolder1
            SubSubSubFolder1
        SubSubFolder2
    SubFolder2
ParentFolder5
    SubFolder1

在实际应用中,通常最好避免Python中的递归:Python解释器无法执行tail call elimination,并且它会强加最大递归深度。但是,在处理递归数据结构(如文件树)时,使用递归算法是很自然的。

FWIW,下面的代码迭代地执行上面代码的逆操作;我用它来从问题中给出的缩进的目录名列表中构建目录树。

import os

data = '''
ParentFolder1
    SubFolder1
    Subfolder2
        SubSubFolder1
    SubFolder3
ParentFolder2
    SubFolder1
ParentFolder3
ParentFolder4
    SubFolder1
        SubSubFolder1
            SubSubSubFolder1
        SubSubFolder2
    SubFolder2
ParentFolder5
    SubFolder1
'''[1:]

def show(seq):
    for row in seq:
        print(row)
    print()

def stripcount(s):
    z = s.lstrip(' ')
    count = len(s) - len(z)
    return z, count

joinpath = os.path.join

def make_dir_tree(dir_tree, root=''):
    ''' Create a directory tree in root from dir_tree,
        which is a list of indented directory names.
    '''
    dir_tree = [stripcount(s) for s in dir_tree]
    #show(dir_tree)

    stack = [root]
    depth = -1
    for dname, count in dir_tree:
        if count > depth:
            depth = count
            stack.append(dname)
        elif count < depth:
            depth = count
            stack.pop()
            stack[-1] = dname
        else:
            stack[-1] = dname

        pathname = joinpath(*stack)
        print(pathname)
        os.mkdir(pathname)


dir_tree = data.splitlines()
show(dir_tree)
make_dir_tree(dir_tree, 'testfolder')