我有以下目录结构,
F:\TestData
和TestData包含20个名称为node1, node2,..., node20
的文件夹
每个节点文件夹包含名称为log.10.X
我需要从所有节点文件夹访问每个日志文件,我已经写了代码,但是它说,File not found - log.*
CODE:
directory = "F:\TestData"
p = subprocess.Popen(["find", "./" + directory, "-name", "log.*"], stdout=subprocess.PIPE)
output, err = p.communicate()
foutput = output.split("\n")
答案 0 :(得分:1)
与POSIX shell不同,Python不会自动在字符串中执行通配(将*
等解释为与相关目录中的文件相关的通配符)。但是,它确实为此提供了a glob
module。您可以使用它来获取匹配文件名的列表:
import glob
filenames = glob.glob(r'F:\TestData\node*\log.*')
答案 1 :(得分:0)
您可以使用python获取目录中的文件列表
import os
directory = "F:\TestData\"
file_list = os.listdir(directory)
log_list = filter(lambda x: x.startswith("log"), file_list)
哦,你必须编写代码来迭代子目录。
父目录中的第一个os.listdir()
,并迭代子目录以获取文件
答案 2 :(得分:0)
Python的glob模块可能是一个选项。
import glob
directory = 'F:\TestData'
logcontents = [open(f,'r').read() for f in glob.glob(directory + '\node*\log.*')]
答案 3 :(得分:0)
您还可以使用walk
,如下所示:
import os
directory = "F:\TestData"
for i in os.walk(directory):
# i like this:
# ('F:\\TestData', ['node1', 'node2', 'node3'], [])
# ('F:\\TestData\\node1', [], ['log.1.txt'])
# ('F:\\TestData\\node2', [], ['log.2.txt'])
print i
if i[2] != []:
# TODO: use the path to finish other
# If dictory noden have some log file, you should use i[2][n].
# So, if you only need log.n.txt, you only use i[2][n].
print os.path.join(i[0], i[2][0])