1

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

我有一系列 (~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

...

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

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

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

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

任何建议/建议将不胜感激(请耐心等待我是编程新手)

4

2 回答 2

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)

但是您需要对其进行修改以适合您的数据和您想要的确切输出格式

于 2013-08-30T09:43:52.610 回答
0

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

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

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

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

要使此功能正常工作,您必须使用要解析的文件列表调用 if。整个数据将存储到输出文件或打印到标准输出。

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))
于 2013-08-30T09:54:33.900 回答