使用Python导入分隔和分页数据的最佳方法

2024-05-29 03:48:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据文件,它们每隔一段时间重复它们的4个标题行,作为分页的一种形式。因此,我不能使用自动导入方法,因为这些额外的标题行妨碍了我的工作。我可以逐行阅读,检查每一行是否是一个头,只检查头的第一行并跳过下面的3行,或者简单地用一个匹配6个连续数据列的正则表达式来解析整个文件,它将匹配每个数据行并轻松地跳过头。在

我想知道是否有一种方法可以用pandas、numpy、csv库或其他一些我没有想到的技巧来导入数据。在

虽然regex很快,但我将要做一系列批处理和权衡研究,我希望我的后处理能够快速处理几十或数百个文件,以显示比较。在

我刚刚意识到,每页的行数似乎总是55行,所以也许一些简单的计数就行了,或者模数——我无论如何都会问这个问题,因为我很好奇是否有人找到了一个处理重复标题或类似“分块”数据的库。在

我将为固定长度的页面添加一个基于模数的解决方案作为答案。。。在

谢谢你的其他想法!在

编辑:这里有一个格式的例子。。。实际上,每页有55行数据,但为了简洁起见,我将其限制在5行。而且,是的,在每个标题的开头的第一列中有一个1,所以也可以使用它。我很确定1在旧版本的代码中曾经是一个FormFeed字符,这对于在大型机上运行的基于FORTRAN的代码的老式分页是有意义的。在

1  DATE: 03/10/14      Analysis Title                                                             

     TIME    PRESSURE      MDOT       THRUST        PT        AB           D
      SEC      PSIA      LBM/SEC       LBF         PSIA      IN^2         IN
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
   11.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
   11.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
1  DATE: 03/10/14      Analysis Title                                                             

     TIME    PRESSURE      MDOT       THRUST        PT        AB           D
      SEC      PSIA      LBM/SEC       LBF         PSIA      IN^2         IN
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
1  DATE: 03/10/14      Analysis Title                                                             

     TIME    PRESSURE      MDOT       THRUST        PT        AB           D
      SEC      PSIA      LBM/SEC       LBF         PSIA      IN^2         IN
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050

Tags: 数据inpt标题dateabtimetitle
1条回答
网友
1楼 · 发布于 2024-05-29 03:48:27

这里有一个固定列数和每页固定行数的解决方案。我想我应该继续把它包装成一个类,因为这就是我使用它的方式(需要加载、处理、绘制、保存为其他格式,等等,这样一个类才有意义)。使用模数来检查标题行上我认为是否优雅。在

import os
import numpy as np


class Data(object):
    def __init__(self):
        super(Data, self).__init__()
        self.time = None
        self.pressure = None

    def load(self, filename):

        #Data Properties
        cols = 7
        lines_per_page = 59
        header_lines = 4

        #Initialize Data
        data = np.empty([0, cols])

        #Open the file
        with open(filename, 'r') as f:

            #Traverse the file's lines
            for i, line in enumerate(f.readlines()):

                #Check whether this is a header line
                if i % lines_per_page >= header_lines:

                    #Split line into columns, convert to float, convert to numpy array, shape as a row
                    linedata = np.array(map(float, line.split())).reshape(1, cols)

                    #Add the row to the bottom of the data
                    data = np.vstack([data, linedata])

        self.time = data[:, 0]
        self.pressure = data[:, 1]

相关问题 更多 >

    热门问题