这可能会造成混淆。
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或遍历目录。我已经编写了很多代码,我希望主要焦点可以回答有关运行条件循环并将该循环内的值放入另一个循环内的write函数的问题。
我宁愿重组这种循环逻辑,而不是从整个os.walk for loop开始。
再次感谢
最佳答案
我不太确定您所说的“条件循环”是什么意思,但是您想要实现的目标是使用基于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')