这可能令人困惑。
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循环。
再次感谢
答案 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')