使用Python从文本文件中提取多行

时间:2017-05-01 06:16:07

标签: python

我有一个如下文字文件。我想提取“参数------>”下面的行,直到参见文件nwirp_nsmc.sen获取参数灵敏度。“并写入不同的文本文件。我怎样才能做到这一点?

OPTIMISATION RESULTS

Covariance matrix and parameter confidence intervals cannot be determined:-
Some form or regularisation was implemented so these are not applicable.
Use the PREDUNC7 utility to obtain a full posterior covariance matrix.
Parameters ----->
Parameter       Estimated value

1.hklay1         3.278692E-06
2.kppt1          4.249307E-07
3.kppt2          2.849132E-06
-------
-------

See file nwirp_nsmc.sen for parameter sensitivities.


Observations ----->

这是我尝试的但它不适用于我的文件。我知道我在这里遗漏了一些东西,但我现在不知道缺少什么。

新提取

inFile = open('nwirp-1.txt')
outFile = open('result2.txt', 'w')
new = []
Set = True
for line in inFile:
    new.append(line)
    if line.startswith("Parameters------>"):
        #---- starts a new data set
        if Set:
            outFile.write("".join(new))
    elif line.startswith("See file nwirp_nsmc.sen for parameter sensitivities."):
        Set = False
        new = []
inFile.close()
outFile.close()

3 个答案:

答案 0 :(得分:1)

最简单的方法是转储文件并拆分:

with open('myfile') as fd:
    relevent = fd.read().split("**")[1]
with open('outfile','w') as fd:
    fd.write(relevent)

假设有一个" **"部分在中间,没有其他" **"。

=====================================

更改了问题

with open('nwirp-1.txt') as inFile, open('result2.txt', 'w') as outFile:
    writing = False
    for line in inFile:
        if line.startswith("Parameters ----->"):
            writing = True
        if writing:
            outFile.write(line)
        if line.startswith("See file"):
            writing = False

特别注意不要使用Set ,它是内置的。你很近,我把它修好了一点。另请注意很酷的with语句,不需要close

答案 1 :(得分:1)

你可以这样试试:

f = open("nwirp-1.txt")

for line in f:
    if line.strip().startswith("Parameters ----->"):
       f2 = open('result2.txt', 'w')
       line = next(f)
       while not line.strip().startswith("See file"):
           f2.write(line)
           line = next(f)
       f2.close()
f.close()

输出

Parameter       Estimated value

1.hklay1         3.278692E-06
2.kppt1          4.249307E-07
3.kppt2          2.849132E-06
4.kppt3          1.548621E-06

答案 2 :(得分:1)

您需要使用带有DOTALL标志的re。

import re

myre = re.compile(r"Parameters ----->(.*?)See file ", re.DOTALL)
parts = myre.findall(text)

if parts:
    with open('foo.txt', 'w') as output:
        for part in parts:
            print(part, file=output)
else:
    print("No match!")

请注意,这假设可能存在多个块,因此re中的?使其非贪婪。