繁体   English   中英

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

[英]Extracting multiple rows from text file using 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()

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

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 ,它是内置的。 你很近,我把它修好了一点。 另请注意cool with statement,无需与它close

你可以尝试这样:

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

您需要使用带有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,这使它不贪心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM