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

2024-10-03 13:18:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解析文本文件中的行,并打印其中找到的数据值。我需要打印每行的“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])

我正在阅读的文本文件:

^{pr2}$

我需要把德尔泰和强度作为数组。并按两个独立的列将它们写入txt文件。就像那样

  13.5423      6553
  17.9918      0.2668E+05

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


Tags: or文件of数据代码inbandif
3条回答

这个例子对于正则表达式来说也很不错。如果您不熟悉正则表达式,那么它们值得一读,因为它们可以避免@user1269942 answer中的大量剥离、拆分和切片(尽管这是解决此问题的一个非常好的答案)

我省略了第一部分,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))

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

让我们分解一下这个表达式

^{pr2}$
  • \s*-0个或更多空白字符(\s表示单个空白字符,*是表示“0次或更多次”的乘数
  • DeltaE-字符串“DeltaE”正好一次
  • \s*-又是空白
  • =-等号正好一次
  • \s*-又是空白
  • ([0-9.E+-]+)-此部分匹配方括号内出现的任何字符串,+表示必须有一个或多个字符。0-90123456789的快捷方式,使用其他字符,我们可以找到大多数看起来像十进制或科学记数法的数字。通过将其放在圆括号中,我们允许自己以后作为一个“群体”收集价值。在
  • .*-任何字符串(我们使用它来避免中间部分必须有一个复杂的正则表达式-.是一个可以是任何内容的单个字符,*表示0次或更多次)
  • Intensity-字符串“Intesity”正好一次
  • \s*-又是空白
  • =-等号正好一次
  • \s*-又是空白
  • ([0-9.E+-]+)-这又是一个数字,在圆括号中的第二个“group”中捕获。在

在创建了表达式之后,我们可以将它与行(re.match)匹配,如果它不匹配,那么我们的变量m将是None,否则我们就有一个匹配。在

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

解析“非结构化”文件的最佳方法是通过正则表达式。在

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

像这样的regex应该可以为您的值匹配group1和group2:

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

然后写信给输出.txt文件。在

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

^{pr2}$

学习方便的python命令:split、strip和string slicing

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

也可以尝试在拆分之前将所有空格替换为“”。 为了更好地了解发生了什么,我们可以看看下面的一行:

^{pr2}$

把它分开。。。在

^{3}$

试着做同样的强度。在

相关问题 更多 >