Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据每行内容对文本文件中的行进行分组?_Python_Text_Line - Fatal编程技术网

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

Python 如何根据每行内容对文本文件中的行进行分组?,python,text,line,Python,Text,Line,假设我有一个包含以下内容的文本文件: 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 5

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

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
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)
假设我会像这样读取文件:

with open('/home/pexp1/mezzi/INPUT') as f:
    lines = f.readlines()
data = [(line.rstrip()).split('\t') for line in lines]
正确的方法是如何将以某个东西(int、字符串等)开头的每一行与下面的每一行进行分组,直到找到符合上述规则的新行? 假设我想调用尊重规则的行并将所有内容都包含在其组中,那么将这些行组合在一起的最佳数据结构是什么

编辑:对不够清晰表示歉意。 如果我运行上面的代码,我在运行
print(data)
时会得到以下结果:

正如你所看到的,这是一个列表列表。 如何将这些项目组合在一起,使包含索引位置0处的项目的列表(在本例中,
12277
122509
等)与它们后面的列表组合在一起(索引位置0、1、2、3、4处没有元素)

例如:

['12277', '17/06/2019', '350', 'BJ201AB', 'FMACRI']
分组 直到下一行包含索引0处的元素:
['12509','21/06/2019','443','DH717WF','BLANCO']

EDIT2:这就是我提出的解决方案:

shipments = []
shuttle_lst = []

for line in data[1:]:
    if len(line[0]) < 1:
        shipments.append(line)
    else:
        shuttle = data[data.index(line) - (len(shipments) + 1)]
        shipments.append(shuttle)
        new_lst = [lst for lst in shipments]
        shuttle_lst.append(new_lst)
        shipments.clear()
装运=[]
穿梭机
对于数据[1:]中的行:
如果len(第[0]行)小于1:
装运。追加(行)
其他:
穿梭=数据[数据索引(行)-(len(装运)+1)]
装运。附加(班车)
new_lst=[lst用于装运中的lst]
穿梭机附加(新)
装运。清除()

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

如果我理解正确,您希望根据标题行对行进行分组,标题行不是以空格开头的行,对吗

考虑以下几点:

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
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']]]

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

如果将空格视为“某物”,则本例中的每一行都以“某物”开头。请定义“某物”。它是整数吗?一个数字?非空格字符?请给我们看一个预期输出的示例。该文件似乎有点像一个固定宽度的平面文件,
12277 17/06/2019
部分是20个字符。我最后写了一些类似的东西,只是页眉行变成了页脚。你的答案肯定比我的更清楚。