我试图解析文本文件中的行,并打印其中找到的数据值。我需要打印每行的“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
这个例子对于正则表达式来说也很不错。如果您不熟悉正则表达式,那么它们值得一读,因为它们可以避免@user1269942 answer中的大量剥离、拆分和切片(尽管这是解决此问题的一个非常好的答案)
我省略了第一部分,if语句,它检查文件的标题。下面的代码只查找包含DeltaE和Intesity的行
当您第一次看到正则表达式时,它非常可怕,但是它是一个定义行的整个内容的表达式。在
让我们分解一下这个表达式
^{pr2}$\s*
-0个或更多空白字符(\s
表示单个空白字符,*
是表示“0次或更多次”的乘数DeltaE
-字符串“DeltaE”正好一次\s*
-又是空白=
-等号正好一次\s*
-又是空白([0-9.E+-]+)
-此部分匹配方括号内出现的任何字符串,+
表示必须有一个或多个字符。0-9
是0123456789
的快捷方式,使用其他字符,我们可以找到大多数看起来像十进制或科学记数法的数字。通过将其放在圆括号中,我们允许自己以后作为一个“群体”收集价值。在.*
-任何字符串(我们使用它来避免中间部分必须有一个复杂的正则表达式-.
是一个可以是任何内容的单个字符,*
表示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:
然后写信给输出.txt文件。在
这样的python代码应该可以工作:
^{pr2}$学习方便的python命令:split、strip和string slicing
也可以尝试在拆分之前将所有空格替换为“”。 为了更好地了解发生了什么,我们可以看看下面的一行:
^{pr2}$把它分开。。。在
^{3}$试着做同样的强度。在
相关问题 更多 >
编程相关推荐