2011-09-03 61 views
0

我想解析每个类似于threadids的日志文件。可以配置任意数量的线程。所有线程都写入相同的日志文件,我正在解析日志文件并为每个线程创建特定的新文件,以便稍后检查它们。
下面我捕获列表中的threadids。
下面的代码是做这项工作,但我觉得这是不高效的。有什么更快的吗?更快地解析所有列表元素的文件,并根据列表元素分析到新文件

sThdiD = ["abc", "cde\"efg"] 
folderpath = "newdir" 
os.system("mkdir " + folderpath) 
for line in open(filetoopen): 
    for i in sThdiD: 
     if i in line: 
      open(folderpath+"/"+i+".log","a+").write(line) 
+2

保留打开文件的列表,而不是每次在循环中调用打开 – jterrace

+0

有多少个threadids?几千个同时打开的文件应该不是真正的问题(如果机器没有被占用)。 – extraneon

+1

use subprocess.call not os.system;它更安全。你也应该把'open(folderpath +“/”+ i +“.log”,“a +”)。write(line)'改成'open(os.path.join(folderpath,i +“.log”),一个+“)。写(线)' – Ben

回答

1

假设你可以适应整个日志文件到内存中,我会保持一个字典映射线程ID由该线程写入线条,然后在最后写出来的整个文件。

thread_map = {} # keys are thread IDs; values are lists of log lines 
for line in open(filetoopen): 
    for i in sThdiD: 
    if i in line: 
     if i not in thread_map: 
     thread_map[i] = [] 
     thread_map[i].append(line) 

for key in thread_map: 
    f = open(folderpath+"/"+key+".log", "w") 
    for line in thread_map[key]: 
    f.write(line) 
    f.close() 

如果你不能保持整个日志文件在内存中,尝试在其中您一次写入每个文件一个一个多通道解决方案。

in_file = open(filetoopen) 
for i in sThdiD: 
    in_file.seek(0) # Reset the file to read from the beginning. 
    out_file = open(folderpath+"/"+i+".log", "w") 
    for line in in_file: 
    if i in line: 
     out_file.write(line) 
    out_file.close() 
in_file.close()