【问题标题】:Python move "met conditional value" outside of loopPython将“满足条件值”移出循环
【发布时间】:2016-02-27 07:03:36
【问题描述】:

这可能会令人困惑。

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

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

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

感谢任何帮助,谢谢!

编辑:

我正在循环一个主目录,并将所有父文件夹写入文本文件。我想在每个父文件夹之间写入其子文件夹:即,如果父文件夹包含更多文件夹,则将这些文件夹写入每个父文件夹之间;并且如果父文件夹不包含更多文件夹,则跳到下一个父文件夹等。我正在使用 if (currentDirLevel - mainLocNum)==(number) 来了解它正在进入多少个目录并执行不同的为每一步编写函数。

我正在尝试以某些格式编写文件夹的名称,具体取决于它们是 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 循环开始。

再次感谢

【问题讨论】:

  • 如果使用'w'打开文件,则无法遍历文件
  • 您是否正在尝试编写一个打开自身并重写自己代码的脚本? “文件”是指这个文件吗?还是其他文件?
  • 所以你只希望f.write(i+command2)x == certain_value 的情况下运行?
  • 确保你发布一些“有效”的东西,如果我(假设)自己运行它,就会显示你的错误。这意味着我还需要一些您正在使用的数据,并了解您期望但没有得到的输出。
  • 你能准确地描述你想让你的程序做什么吗?

标签: python replace conditional placeholder substitution


【解决方案1】:

我不太清楚你所说的“条件循环”是什么意思,但你想要实现的目标很容易使用基于os.listdir 的小型递归函数来完成。您可以使用os.walk 执行此操作,但我经常发现显式调用os.listdiros.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')

【讨论】:

  • 感谢您投入所有时间和精力来回答我的问题。我会试一试。非常感谢您的帮助。
  • @MikeIssa:很高兴!老实说,我对逆问题更感兴趣。 :) 用于创建目录树的代码可能会派上用场...
  • 是的,那是你在那里做的一件有趣的事情。从文本目录树创建或逆向工程目录路径。很酷的东西......尊重!
猜你喜欢
  • 2021-12-24
  • 2021-05-23
  • 2018-06-29
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多