如何根据每一行的内容在文本文件中对行进行分组?

时间:2019-06-27 11:09:17

标签: python text line

假设我有一个包含以下内容的文本文件:

$ source venv/bin/activate

假设我会这样读取文件:

12277   17/06/2019  350 BJ201AB FMACRI                  
                    0   J   52  4081.15 166851
                    0   J   52  4496.64 166852
                    0   J   52  5139.07 166855
                    0   J   52  5773.82 166858
                    J   E   70  25  B159681
12509   21/06/2019  443 DH717WF BLANCO                  
                    B   J   42  5376.63 5164/A
12504   21/06/2019  443 EB631NF LUCCIG                  
                    B   J   44  5567.46 5165/A
                    0   J   52  5347.58 166950
                    0   J   52  4742.4  166953
                    0   J   18  1146.24 427876
                    0   J   4   0.4 427877
                    J   0   372 1   B159763
                    R   0   1567    1   B159764

将以某内容(整数,字符串等)开头的每一行与该行下的其他所有行进行分组,直到找到遵循上述规则的新行的正确方法是什么? 假设我想打电话给遵守规则的那一行,并将所有内容归为一组,那么将这些行组合在一起的最佳数据结构是什么?

编辑:抱歉,内容不够清晰。 如果运行上面的代码,则在运行with open('/home/pexp1/mezzi/INPUT') as f: lines = f.readlines() data = [(line.rstrip()).split('\t') for line in lines] 时会得到以下提示:

print(data)

如您所见,它是列表的列表。 如何将这些项目分组在一起,以这样的方式将列表包含的索引位置为0(在这种情况下为[ ['12277', '17/06/2019', '350', 'BJ201AB', 'FMACRI'], ['', '', '', '', '', '0', 'J', '52', '4081.15', '166851'], ['', '', '', '', '', '0', 'J', '52', '4496.64', '166852'], ['', '', '', '', '', '0', 'J', '52', '5139.07', '166855'], ['', '', '', '', '', '0', 'J', '52', '5773.82', '166858'], ['', '', '', '', '', 'J', 'E', '70', '25', 'B159681'], ['12509', '21/06/2019', '443', 'DH717WF', 'BLANCO'], ['', '', '', '', '', 'B', 'J', '42', '5376.63', '5164/A'], ['12504', '21/06/2019', '443', 'EB631NF', 'LUCCIG'], ['', '', '', '', '', 'B', 'J', '44', '5567.46', '5165/A'], ... ] 12277等进行分组)以及下面的列表(索引pos。0、1、2、3、4处没有元素)?

示例:

122509

['12277', '17/06/2019', '350', 'BJ201AB', 'FMACRI'] ['', '', '', '', '', '0', 'J', '52', '4081.15', '166851']等,直到下一行包含索引为0的元素:['', '', '', '', '', '0', 'J', '52', '4496.64', '166852']

EDIT2:这是我想出的解决方案:

['12509', '21/06/2019', '443', 'DH717WF', 'BLANCO']

这将创建一个列表列表,其中每个标题都成为该列表的最后一个元素。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您想根据标题行(不是以空格开头的行)对行进行分组吗?

请考虑以下内容:

import pprint
pp = pprint.PrettyPrinter(indent=4)

# A list of lists
data = []

with open('data.dat') as f:
    for line in f:
        if line.startswith(" ") or line.startswith("\t"):
            if not data:
                raise RuntimeError("Wrong data - first line is not legit")
            data[-1].append(line.split())
            continue

        # If here, this is a header line
        data.append([line.split()])

pp.pprint(data)

此打印:

[   [   ['12277', '17/06/2019', '350', 'BJ201AB', 'FMACRI'],
        ['0', 'J', '52', '4081.15', '166851'],
        ['0', 'J', '52', '4496.64', '166852'],
        ['0', 'J', '52', '5139.07', '166855'],
        ['0', 'J', '52', '5773.82', '166858'],
        ['J', 'E', '70', '25', 'B159681']],
    [   ['12509', '21/06/2019', '443', 'DH717WF', 'BLANCO'],
        ['B', 'J', '42', '5376.63', '5164/A']],
    [   ['12504', '21/06/2019', '443', 'EB631NF', 'LUCCIG'],
        ['B', 'J', '44', '5567.46', '5165/A'],
        ['0', 'J', '52', '5347.58', '166950'],
        ['0', 'J', '52', '4742.4', '166953'],
        ['0', 'J', '18', '1146.24', '427876'],
        ['0', 'J', '4', '0.4', '427877'],
        ['J', '0', '372', '1', 'B159763'],
        ['R', '0', '1567', '1', 'B159764']]]

结果是列表列表(列表!)。每个第二级列表的第一项是标题行,其余的是该组中的行