使用python3在文本文件中查找信息

时间:2013-08-30 08:38:52

标签: python python-3.x

想知道你是否可以提供帮助。

我有一系列(~950KB)'。txt'来自计算化学程序的输出文件。每种都有以下一般格式:

Job Started  at 15:45.50 12th June       2013                               

...

 **** Optimisation achieved ****

 Final energy =    -348.67740315 eV
 Final Gnorm  =       0.00037832

...

 **** Optimisation achieved ****

 Final defect energy  =      103.09066596
 Final defect Gnorm   =        0.00000141

...

[N.B。第二次优化可能并不总能实现,但无论如何都会打印出“缺陷能量”:如果是这种情况,我对结果不感兴趣,因为它没有意义]

[N.B。由点表示的行数因文件而异,并且在读取文件之前是未知的。它们也没有编号。]

我的任务是找到上面显示的行并将它们输出到新创建的“结果”文件中。

我知道如何打开和读取文件,但不确定如何从目录中的每个文件中查找/复制上述行。

任何意见/建议都会受到赞赏(请耐心等待我是编程新手)

2 个答案:

答案 0 :(得分:1)

作为一个起点,你可以做这样的事情

def find_energy(fn):
    lines = open(fn).readlines()
    result_lines = [l for l in lines if '*optimisation achieved**' in l]
    print(fn, result_lines)

但您需要修改它以适合您的数据和您想要的确切输出格式

答案 1 :(得分:0)

问题不是100%清楚,但从这些部分我可以理解这不是一项复杂的任务。

我建议您使用以下格式读取所有文件和打印输出数据:

  

(文件名,最终能量,缺陷能量)

只有在您提供的每个文件中出现一次“最终能量”和一次出现“缺陷能量”时,此功能才有效。

要使此功能起作用,您必须调用if以解析文件列表。整个数据将存储到输出文件或打印到stdout。

def get_data_by_pattern(filenames, output_file=None, text_pattern='optimisation achieved'):
try:
    ofh = open(output_file, 'w+')
except (IOError, OSError):
    ofh = sys.stdout
for f_name in filenames:
    try:
        filedata = open(f_name, 'r').read()
    except (IOError, OSError), err:
        print 'Problem with file "%s": %s' % (f_name, err)
        continue
    final_energy = ''
    defect_energy = ''
    for l in b.splitlines():
        if text_pattern in l:
            if 'final' in l:
                final_energy = l.split('=')[1]
            elif 'defect' in l:
                defect_energy = l.split('=')[1]
        if final_energy and defect_energy:
            break
    ofh.write('(%s,%s,%s)\n' % (filename, final_energy, defect_energy))