【问题标题】:Get number from a line of a txt file and use it as input to extract lines从 txt 文件的一行中获取数字并将其用作输入以提取行
【发布时间】:2016-07-26 14:17:09
【问题描述】:

标题可能听起来很奇怪。所以我会尽力解释这个问题。

我有一个 txt 文件(由其他软件生成),如下所示:

 EVAPORATION AND TRANSIPIRATION TOTALS     PERIOD    1   STEP    1,   15 COLUMNS,   10 ROWS,  1 LAYERS       ELAPSED TIME 6.0000000E+00           DAYS

    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000        1.00000    


 EVAPORATION AND TRANSIPIRATION TOTALS     PERIOD    1   STEP    2,   15 COLUMNS,   10 ROWS,  1 LAYERS       ELAPSED TIME 1.2000000E+01           DAYS

    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    10.00000        2.00000        2.00000        2.00000        2.00000        7.00000        2.00000        6.00000        6.00000        5.00000        2.00000        3.00000        4.00000        1.00000        0.00000


 EVAPORATION AND TRANSIPIRATION TOTALS     PERIOD    1   STEP    3,   15 COLUMNS,   10 ROWS,  1 LAYERS       ELAPSED TIME 1.8000000E+01           DAYS

    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    2.00000        4.00000        1.00000        2.00000        4.00000        1.00000        3.00000        4.00000        6.00000        8.00000        0.00000        1.00000        2.00000        2.00000        1.00000    
    2.00000        3.00000        2.00000        2.00000        2.00000        5.00000        0.00000        6.00000        1.00000        3.00000        2.00000        3.00000        4.00000        1.00000        0.00000      


 EVAPORATION AND TRANSIPIRATION TOTALS     PERIOD    1   STEP    4,   15 COLUMNS,   10 ROWS,  1 LAYERS       ELAPSED TIME 2.4000000E+01           DAYS

    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000        0.00000    
    3.00000        3.00000        3.00000        3.00000        3.00000        3.00000        3.00000        4.00000        4.00000        3.00000        2.00000        1.00000        0.00000        3.00000        1.00000    

如您所见,它有 2 个空行(第一个块也是如此,此处不可见) 1 行包含一些文本,另一个空行和一种矩阵(等等)。

我想要做的是从一些 STEP 的每个矩阵(来自每个块)中提取 最后 n 行(例如,以用户的数字形式给出从第 2 步到第 3 步)

n 值由每个矩阵上方的 ROWS 数字给出。每个块的数字始终相同(因此在此示例中,我想提取第 2 和第 3 矩阵的最后 10 行)。

我需要将行块放入字典中,其中 STEP 数字中的键(每个块的更改,在本例中为 2 和 3)和值是对应的最后 10行(所以也许 np 数组作为值)。

有人有什么建议吗?

谢谢

【问题讨论】:

  • 从“第 2 步到第 3 步”。这会一直是连续的吗?
  • @Reti43.. 我会说是的.. 文件可能很大,但 STEP 间隔始终是连续的,没有任何刹车..
  • 您希望文件有多大,以 MB 为单位?
  • mmm 如果 MB 不超过 2-3 MB.. 通常我会说数百 KB

标签: python string match string-matching


【解决方案1】:

以下假设文件的格式是特定的(足够合理,因为它是由程序生成的)。也就是说,对于每个块,你有两个空行、一个字符串行、一个空行和 20 行数据(总共 24 行)。

由于文件相对于可用内存较小,因此您可以一次性加载整个文件。然后通过简单的算术,您可以计算出从特定块开始读取要跳过多少行。然后,您可以将接下来的 n 行作为生成器传递给 numpy.genfromtxt(),这将有效且轻松地将它们加载到数组中。唯一需要注意的是,当您使用 readlines() 读取文件时,您会随身携带换行符,当您将数据传递给 numpy (line[:-1]) 时要删除它。

import numpy as np

def read_data(fname, rows, first_block, last_block):
    with open(fname) as f:
        data = f.readlines()
    blocks = {}
    for block in range(first_block, last_block+1):
        start = 24 * block + 24 - rows
        blocks[block] = np.genfromtxt((line[:-1] for line in data[start:start+rows]), autostrip=True)
    return blocks

你可以这样运行

data = read_data('my_data.txt', 10, 2, 3)

它会返回一个浮点类型数组的字典。在这种情况下,您将拥有 data[2]data[3]

【讨论】:

  • 哇..惊人的简单..只有一个规范..实际上文件没有标题..它以2个空行、字符串行、空行、块等开头..
  • 我尝试使用示例文件运行您的函数(我也在问题中编辑了该文件)但它总是返回由零组成的数组..
【解决方案2】:

您可以使用.split() 函数来简化此操作。解释得很好here

我确信这不是最有效的方法(欢迎提出任何其他建议),但是因为您知道每个值之间的空格数,所以可以使用它来获取值列表。您提供的代码中的每个值之间目前似乎有 8 个空格。一旦你有 打开存储为 myfile 的文件,例如,如果您调用

file = myfile.split("        ")

项目列表存储在文件中。这个列表基本上是myfile的全部,但是每次你看到两个项目之间有8个空格,这就会成为文件中的一个新项目。因此,您的每个值都将存储为此列表的一个单独项目,因为每个值之间有 8 个空格。您可能需要删除或忽略列表的前几项,因为这些将包括已拆分的标题部分。这是一个非常糟糕的解释,但希望你能弄清楚。

您可以使用它来编写一个函数,将每个值块放在其单独的列表中。

首先使用它将每个块放入列表列表(嵌套列表)中,其中主列表中的每个项目是块的一行(或一列,取决于您希望如何访问它们)。如果您以前没有遇到过这个概念,here 会介绍它。所以,他们最终会是这样:

step1 = [[0.00000, 0.00000, 0.00000...], [0.00000, 0.00000, 0.00000...], [0.00000, 0.00000, 0.00000...], ...]


在这种情况下,step1 将包含 20 个列表(每个列表是 STEP 1 块的一行),每个列表包含 15 个值 - STEP 1 块。

如果您想访问表格的第 3 行,您只需键入 step1[3],这将为您提供一个列表,其中包含第 3 行的所有项目,从左到右在上面显示的块上按顺序排列在您的问题中(为了解释起见,我称第一个(顶部)row 0、第二个 row 1 等。

如果您想在第 4 行第 3 列(称为第一列 column 0)中查找项目,您可以将其查找为 step1[4][3]

请注意,我首先分配了行,然后将列作为列表嵌套在其中,因为这样更容易一次提取整行,如您所愿。

【讨论】:

  • 感谢您的回答。快速解释如何使用split 功能肯定会对我有所帮助.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多