Python 从特定目录中选择文件
我试图循环遍历子目录列表,并执行两个相关操作:Python 从特定目录中选择文件,python,directory,path,glob,Python,Directory,Path,Glob,我试图循环遍历子目录列表,并执行两个相关操作: 仅选择与特定模式匹配的子目录,并保存该名称的一部分 读取该子目录中的文件 我曾尝试在中修改答案,但仅打开某些子目录时遇到问题。我知道我可以递归地这样做,循环遍历每个文件,并使用Path.parent提取其父目录,但这也会进入我不感兴趣的目录 我的文件结构如下所示: 002normal |- names.txt |- test.txt 002custom |- names.txt |- test.txt 我只希望目录以“正常”结尾。然后我将读取
- 仅选择与特定模式匹配的子目录,并保存该名称的一部分
- 读取该子目录中的文件
Path.parent
提取其父目录,但这也会进入我不感兴趣的目录
我的文件结构如下所示:
002normal
|- names.txt
|- test.txt
002custom
|- names.txt
|- test.txt
我只希望目录以“正常”结尾。然后我将读取该目录中名为“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)
您可以就地修改
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
的文档:
当top-down
为True
时,调用者可以就地修改dirnames
列表
(可能使用del
或slice赋值)和walk()
只会重复出现
进入名称保留在dirnames
中的子目录;这可能是
用于删减搜索,强制执行特定的访问顺序,甚至
通知调用方创建或重命名目录的walk()
在它再次恢复之前,walk()
这就是你可以用你的文件结构来做的。首先,检查是否有子目录以“normal”结尾,如果有,可以检查文件中的内容。此外,您还必须构建文件的路径,以便可以使用os.path.join
如果您有多个深度未知的子目录,您必须在运行时处理,但只要包含names.txt的目录以正常方式结束,它就可以正常工作。我喜欢这样,它非常优雅。第二行到最后一行需要是open(os.path.join(root_dir,subdir,'names.txt'),'r')作为f:though另外,假设上面有其他目录,如何提取目录名,例如“002normal”?啊,确实如此。我已经用
names.txt
更新了加入subdir
的答案(顺便说一下,不需要root\u dir
)。现在,输出还包括通过调用os.path.basename
,提取子目录的基本名称。谢谢。假设上面还有其他目录,如何提取目录名,例如“002normal”?正如blhsing所说的,您可以使用os.path.basename(subdir)。但我还要补充一点。
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())