【问题标题】:Parsing multiple lines from a txt output从 txt 输出中解析多行
【发布时间】:2021-11-19 19:51:54
【问题描述】:

我需要解析输出文件的一部分,看起来像这样(为了清楚起见,还附上了图片)

y,mz) = (-.504D-04,-.543D-04,-.538D-03)








The expected output is : 
the code I have so far looks like below: 

类 NACParser(ParseSection): name = "耦合"

这很好,但有一些问题:

  1. 它只从最后一行开始打印,我认为这是因为它会因为其他类似的行而被覆盖。

  2. 此代码仅适用于该特定分子,我想要适用于任何分子的代码。我的意思是:在这个例子中 - 我有一个有 15 个原子的分子,第一个原子是 c(碳),第 5 个原子是 h(氢),第 11 个原子是 s(硫),但原子总数(即目前 15 ),当我有不同的分子时,原子的名称可能不同。

所以我想知道如何编写适用于通用分子的通用代码。有什么帮助吗?

【问题讨论】:

    标签: python regex parsing


    【解决方案1】:

    这将按照您的要求进行。也许你可以以此为基础。当我找到带有“ATOM”的行时,我只是收集所有原子 ID,并在找到带有“d/d”的行时创建 dict 条目。我会显示输出,但我只是输入了伪造的数据,因为我不想重新输入所有这些。

    import re
    from pprint import pprint
    
    header = r"(\d+ [a-z]{1,2})"
    
    atoms = []
    gather = {}
    for line in open('x.txt'):
        if len(line) < 5:
            continue
        if 'ATOM' in line:
            atoms = re.findall( header, line )
            atoms = [s.replace(' ','') for s in atoms]
            continue
        if '/d' in line:
            parts = line.split()
            row = parts[0].replace('/','')
            for at,val in zip(atoms,parts[1:]):
                gather[at+'_'+row] = val
    pprint(gather)
    

    这是您的测试数据的输出。我希望您意识到剪切和粘贴的数据与图像不匹配。图片使用d/dx,但剪切粘贴使用dE/dx。我假设您也想要 dict 标签中的“E”,但如果您不这样做,这很容易解决。

    {'10c_dEdx': '0.8337613D-02',
     '10c_dEdy': '-0.8171767D-01',
     '10c_dEdz': '-0.4316928D-02',
     '11s_dEdx': '0.3138990D-01',
     '11s_dEdy': '0.3893252D-01',
     '11s_dEdz': '0.2767787D-02',
     '12h_dEdx': '0.8416159D-02',
     '12h_dEdy': '0.3335059D-02',
     '12h_dEdz': '0.1357569D-01',
     '13h_dEdx': '0.1128067D-02',
     '13h_dEdy': '-0.1457401D-01',
     '13h_dEdz': '-0.7834375D-03',
     '14h_dEdx': '0.8941240D-02',
     '14h_dEdy': '0.4869915D-02',
     '14h_dEdz': '-0.1273530D-01',
     '15h_dEdx': '0.4292434D-03',
     '15h_dEdy': '-0.1418384D-01',
     '15h_dEdz': '-0.7764904D-03',
     '1c_dEdx': '-0.1150239D-01',
     '1c_dEdy': '0.4798462D-02',
     '1c_dEdz': '0.6015413D-05',
     '2c_dEdx': '0.2259669D-01',
     '2c_dEdy': '0.5902019D-01',
     '2c_dEdz': '0.3707704D-02',
     '3c_dEdx': '-0.3153006D-02',
     '3c_dEdy': '-0.4060517D-01',
     '3c_dEdz': '-0.2306249D-02',
     '4n_dEdx': '-0.2718508D-01',
     '4n_dEdy': '0.3404657D-01',
     '4n_dEdz': '0.1334956D-02',
     '5h_dEdx': '-0.1064344D-01',
     '5h_dEdy': '-0.1054522D-01',
     '5h_dEdz': '-0.8032586D-03',
     '6c_dEdx': '0.3017851D-01',
     '6c_dEdy': '-0.2805275D-01',
     '6c_dEdz': '-0.9413310D-03',
     '7s_dEdx': '-0.2253417D-01',
     '7s_dEdy': '0.1196856D-01',
     '7s_dEdz': '0.2069422D-03',
     '8n_dEdx': '-0.3195785D-01',
     '8n_dEdy': '0.1888257D-01',
     '8n_dEdz': '0.3914382D-03',
     '9h_dEdx': '-0.4441489D-02',
     '9h_dEdy': '0.1382483D-01',
     '9h_dEdz': '0.6724659D-03'}
    

    【讨论】:

    • 谢谢!我想知道输出是否也可以安排(?)这样'1c_dEdx':'-0.1150239D-01',首先出现'1c_dEdy':'0.4798462D-02',等等?
    • 它之所以这样显示是因为我使用pprint 打印它,它按字母顺序对键进行排序。如果您自己枚举 dict 键,它们将按照插入的顺序出现:1c、2c、3c 等。当然,您可以将键拉入列表并根据需要对其进行排序。
    • 它适用于任意数量的原子。你试试会更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多