如何读取python中的特定行并将数据打印到文本文件或控制台窗口?

时间:2015-11-16 21:31:49

标签: python parsing

我正在尝试从文本文件中解析行,并打印在其中找到的数据值。我需要从每行打印“DeltaE”和“Intensity”

到目前为止我的代码:

if ('Duschinsky Tranformation' or 'Calculations of Band Intensities') \
    in line:
    while not 'DeltaE = ' in line:
        line = next(inputfile)
deltae = float(line.split()[0])

正在阅读的文字档案:

 ==================================================
             Duschinsky Transformation
 ==================================================

 ==================================================
          Calculations of Band Intensities
 ==================================================

  Energy of the 0-0 transition:  14394.5813 cm^(-1)


 Notes about the overlap integrals description:
 - DeltaE is the relative energy of the transition (wrt 0-0)
 - TDMI^2 is the square of the transition dipole moment integral
 - Intensity is the line intensity

-- To: vibronic fundamental state --

Initial state: <0|
Final state: |0>
  DeltaE =     0.0000 | TDMI^2 =  5.657    , Intensity = 0.5604E+06
 ........................................
 --------------------
++ Spectrum progression:   68.60%

-- To: single overtones --

Initial state: <0|
Final state: |1^1>
  DeltaE =    13.5423 | TDMI^2 = 0.6670E-01, Intensity =  6553.    
 ........................................
Initial state: <0|
Final state: |2^1>
  DeltaE =    17.9918 | TDMI^2 = 0.2693    , Intensity = 0.2668E+05
 ........................................
Initial state: <0|
Final state: |3^1>
  DeltaE =    22.4523 | TDMI^2 = 0.4740E-01, Intensity =  4644.    
 ........................................
Initial state: <0|
Final state: |5^1>
  DeltaE =    26.5963 | TDMI^2 = 0.1649E-01, Intensity =  1633.   

我需要读取DeltaE和Intensity作为数组。并通过2个单独的列将它们写入txt文件。像那样

  13.5423      6553
  17.9918      0.2668E+05

等 此外,如果你想看到我正在使用的一些例子,你可以下载解析器文件 http://www.filedropper.com/gaussianparser

3 个答案:

答案 0 :(得分:1)

方便的python命令学习:拆分,剥离和字符串切片

for line in inputfile:
  line = line.strip() #remove whitespace before and after
  if line[0:6] == 'DeltaE':
    #then we have a line like: DeltaE =    13.5423 | TDMI^2 = 0.6670E-01, Intensity =  6553.
    deltae = float(line.split('|')[0].strip().split('=')[1].strip())
    intensity = float(line.split('|')[1].strip().split(',')[1].strip().split('=')[1].strip())

    print deltae, ',', intensity

您还可以尝试在拆分前用''替换所有空格。 为了更好地了解正在发生的事情,我们可以看看这一行:

    deltae = float(line.split('|')[0].strip().split('=')[1].strip())

并将其分解......

    temp = line.split('|')[0].strip() #temp="DeltaE =    13.5423"
    temp = temp.split('=')[1].strip() #temp is now "13.5423"
    deltae = float(temp) #convert string to float.

尝试以强度做同样的事情。

答案 1 :(得分:1)

解析那个&#34;非结构化&#34;的最好方法文件是通过正则表达式。

您可以使用regex101来学习基础知识。

像这样的正则表达式可以使group1和group2匹配您的值:

           Group 1                           Group 2
             |                                 |
DeltaE =.*\s(.*) [|] TDMI\^2 =.*Intensity =.* (.*\d)

然后将其写入output.txt文件。

像这样的python代码应该可以工作:

import re

expr = re.compile(r'DeltaE =.*\s(.*) [|] .*Intensity =.* (.*\d)')
with open("file.txt") as input_file:
    with open("output.txt", 'w') as out:
        for line in input_file:
            m = expr.search(line)
            if m:
                out.write('\t'.join([m.group(1), m.group(2), '\n']))

答案 2 :(得分:0)

这个例子也适用于正则表达式。如果您不熟悉正则表达式,那么它们值得一读,因为它们可以避免在@ user1269942答案中进行大量的剥离,分割和切片(尽管这是对这个问题的一个非常好的答案)

我省略了第一部分,if语句检查文件的标题。下面的代码只查找包含DeltaE和Intesity

的行
import re

for line in text.splitlines():
    m = re.match("\s*DeltaE\s*=\s*([0-9.E+-]+).*Intensity\s*=\s*([0-9.E+-]+)", line)
    if m != None:
            print (m.group(1), m.group(2))

当你第一次看它时,正则表达式非常可怕,但是它是一个定义行的整个内容的单个表达式。

让我们分解表达

\s*DeltaE\s*=\s*([0-9.E+-]+).*Intensity\s*=\s*([0-9.E+-]+)
  • \s* - 0个或更多空白字符(\s表示单个空格字符,*是一个乘以“0”或更多次的乘数&#39;
  • DeltaE - 字符串&#34; DeltaE&#34;一次
  • \s* - 再次空白
  • = - 等号恰好一次
  • \s* - 再次空白
  • ([0-9.E+-]+) - 此部分匹配方括号内显示的任何字符串,+表示必须有1个或多个字符。 0-90123456789的快捷方式,对于其他字符,我们可以找到大多数看起来像小数或科学记数的字符。通过将其放在圆括号中,我们允许自己稍后将其作为“&#39;组”来收集价值。
  • .* - 任何字符串(我们使用它来避免必须为中间部分设置复杂的正则表达式 - .是单个字符,可以是任何字符,*表示0或和以前一样多次)
  • Intensity - 字符串&#34; Intesity&#34;一次
  • \s* - 再次空白
  • = - 等号恰好一次
  • \s* - 再次空白
  • ([0-9.E+-]+) - 这是一个数字,在第二个组中被捕获&#39;用圆括号。

创建表达式后,我们可以将其与行(re.match)匹配,如果它不匹配则我们的变量m将为None,否则我们有一场比赛。

if m != None然后我们匹配,然后我们可以使用m.group(1)来获取与第一组圆括号匹配的值,并使用m.group(2)来获得第二个。然后我们使用print打印出来。