【问题标题】:Parsing Text file and segregating the data in a Dictionary解析文本文件并在字典中分离数据
【发布时间】:2018-12-25 12:24:08
【问题描述】:

我在解析文本文件时遇到了一个复杂的问题。

我需要什么:

  1. 通读文本文件。

  2. 如果一行匹配特定条件,则创建一个名为(条件 1)的键

  3. 将后面的行复制为列表。这个列表需要关联key(条件1)

  4. 当再次遇到该条件时,一个新的密钥并复制下面的行并重复步骤3直到文件结束

问题:我无法在列表中为给定键添加新项目

示例文本输入文件:

A1 letters characters jgjgjg
A2 letters numbers fgdhdhd
D1 letters numbers haksjshs
condition1, dhdjfjf
K2 letters characters jgjgjg
J1 alphas numbers fgdhdhd
L1 letters numbers haksjshs
condition2, dhdjfjf
J1 alphas numbers fgdhdhd
D1 letters numbers haksjshs
J1 alphas numbers fgdhdhd
D1 letters numbers haksjshs

预期字典:

dictone = {'condition1':['K2 letters characters jgjgjg','J1 alphas numbers fgdhdhd','L1 letters numbers haksjshs'], 'condition2':['J1 alphas numbers fgdhdhd','D1 letters numbers haksjshs','J1 alphas numbers fgdhdhd','D1 letters numbers haksjshs'..........}

这是我到目前为止所做的......

flagInitial = False # flag to start copy after encountering condition

    with open(inputFilePath, "r") as tfile:

        for item in tfile:

            gcmatch = gcpattern.match(item)

            if gcmatch:

                extr = re.split(' ', item)
                laynum = extr[2]

                newKey = item[2:7] + laynum[:-1]
                flagInitial = True
                gcdict[newKey] = item
                continue

            if flagInitial == True:
                gcdict[newKey].append(item)  # stuck here 
                # print(gcdict[newKey])
                # print(newKey)

我是否缺少语法或其他东西?

【问题讨论】:

  • 您是否有任何形式的追溯?这可能就像更改以下行一样简单:gcdict[newKey] = itemgcdict[newKey] = [item],这样您实际上存储的是列表(可以附加到)而不是字符串。
  • 你在现场!!..就是这样,我更新到 [item] 并且它有效..

标签: python list parsing dictionary append


【解决方案1】:

试试这个:

In [46]: from collections import defaultdict

In [47]: d = defaultdict(list)

In [48]: cond = None
    ...: for i in mystring.splitlines():
    ...:     if 'condition' in i.split()[0]:
    ...:         cond = i.split()[0][:-1]        ...:         
    ...:     elif cond:
    ...:         d[cond].append(i)


In [49]: d
Out[49]: 
defaultdict(list,
            {'condition1': ['K2 letters characters jgjgjg',
              'J1 alphas numbers fgdhdhd',
              'L1 letters numbers haksjshs'],
             'condition2': ['J1 alphas numbers fgdhdhd',
              'D1 letters numbers haksjshs',
              'J1 alphas numbers fgdhdhd',
              'D1 letters numbers haksjshs']})

【讨论】:

    【解决方案2】:

    使用re.search 函数和collection.defaultdict 对象:

    import re
    import collections
    
    with open('input.txt', 'rt') as f:
        pat = re.compile(r'^condition\d+')
        d = collections.defaultdict(list)
        curr_key = None
    
        for line in f:               
            m = pat.search(line)
            if m:
                curr_key = m.group()
                continue
            if curr_key:
                d[curr_key].append(line.strip())         
    
    print(dict(d))        
    

    输出:

    {'condition1': ['K2 letters characters jgjgjg', 'J1 alphas numbers fgdhdhd', 'L1 letters numbers haksjshs'], 'condition2': ['J1 alphas numbers fgdhdhd', 'D1 letters numbers haksjshs', 'J1 alphas numbers fgdhdhd', 'D1 letters numbers haksjshs']}
    

    【讨论】:

    • 集合也可以用于列表吗?这对我来说似乎更少的代码。所以,我也想将它应用到程序的其他部分。
    • @Polyhedronic,你能详细说明一下集合也可以用于列表是什么意思吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2017-07-21
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多