gpt4 book ai didi

Python将 "met conditional value"移到循环之外

转载 作者:行者123 更新时间:2023-11-30 23:04:00 29 4
gpt4 key购买 nike

这可能会令人困惑。

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)==(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 循环开始。

再次感谢

最佳答案

我不太确定术语“条件循环”是什么意思,但是使用基于 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')

关于Python将 "met conditional value"移到循环之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33900433/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com