我正在尝试从文本文件中解析行,并打印在其中找到的数据值。我需要从每行打印“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
答案 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-9
是0123456789
的快捷方式,对于其他字符,我们可以找到大多数看起来像小数或科学记数的字符。通过将其放在圆括号中,我们允许自己稍后将其作为“&#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打印出来。