我试图遍历子目录列表,并执行两项相关操作:
仅选择与特定模式匹配的子目录,并保存该名称的一部分
读取该子目录中的文件
我尝试调整this question中的答案,但仅打开某些子目录有困难。我知道我可以递归执行此操作,在其中循环遍历每个文件,并使用Path.parent
拉出其父目录,但这也将进入我不感兴趣的目录。
我的文件结构如下:
002normal
|- names.txt
|- test.txt
002custom
|- names.txt
|- test.txt
我只希望以“ normal”结尾的目录。然后,我将在该目录中读取名为“ names.txt”的文件。我尝试了以下类似的方法,但是没有运气。
import os
root_dir = "/Users/adamg/IM-logs"
for subdir, dirs, files in os.walk(root_dir):
for f in files:
print(subdir)
答案 0 :(得分:1)
您可以就地修改dirs
列表以过滤名称不以'normal'
结尾的任何子目录,以使os.walk
不会遍历它们:
for subdir, dirs, files in os.walk(root_dir):
dirs[:] = (name for name in dirs if name.endswith('normal'))
if 'names.txt' in files:
with open(os.path.join(subdir, 'names.txt')) as file:
print(os.path.basename(subdir), file.read())
摘录自os.walk
的文档:
当
topdown
为True
时,呼叫者可以就地修改dirnames
列表 (也许使用del
或切片分配),而walk()
仅会递归 进入名称保留在dirnames
中的子目录中;这可以是 用于修剪搜索,强加特定的访问顺序,甚至 通知walk()
有关呼叫者创建或重命名的目录的信息 在再次恢复walk()
之前。
答案 1 :(得分:1)
import os
root_dir = "/Users/adamg/IM-logs"
for subdir, dirs, files in os.walk(root_dir):
if str(subdir).endswith("normal"):
for file in files:
if str(file).startswith("names"):
print(os.path.basename(subdir), file)
f = open(os.path.join(root_dir,subdir,file), "r")
print(f.read())
这就是使用文件结构进行操作的方式。首先,您检查子目录是否以“ normal”结尾,如果可以,则可以检查文件中的内容。另外,您还必须构建文件的路径,以便可以使用os.path.join
如果您有多个深度不明的子目录,则必须使用while进行一些操作,但是只要包含names.txt的目录以正常结尾就可以使用。