读取未知名称文件的选定部分

时间:2016-11-11 11:41:50

标签: python python-2.7 matplotlib

我有很多名字未知的数据文件。我已经找到了一种方法来让它们全部读取和打印,但我想制作它们的图形,所以我需要一种可行的数据。

数据文件排列整齐(标题的每一行都包含有关存储内容的信息)但是我在制作一个选择我需要的数据的脚本时遇到了麻烦。该文件的前50行包含我只需要使用的几个标题,这在使用类似的东西时没有问题:

    for filename in glob.glob(fullpath):
        with open(filename, 'r') as f:
            for line in f:
                if 'xx' in line:
                     Do my thing
                if 'yy' in line:
                     Do my thing etc.

但是在标题下面有一个未确定列数和未确定行数的数据块(列数和每列的内容,在标题中指定)。我无法通过例如matplotlib来制作图表。 (我可以通过手动将数据复制到一个单独的文件并将其读取为可绘制的格式来实现,但这并不是我想要在每个文件中执行的操作......)数据启动之前的行包含非常有用的内容#eoh但我无法找到一种方法来结合前50行的选择性读取然后开关将所有内容读入数组。如果有方法以更好的方式做我想要的事情(包括选择地图并查看哪些文件在那里并且可读)我愿意接受建议。

更新 @ImportanceOfBeingErnest提出的解决方案似乎非常有用,但我没有让它工作。 所以我将从答案中提到的数据开始。 列名以下列格式给出:

#COLUMNINFO = NUM​​BER1,UNIT,MEASUREMENT,NUMBER2

在此格式中,number1是列号,单位是测量单位,测量值是测量值,number2是测量值。 我怀疑,数据是以空格分隔的,但这不会成为问题。

我试图在循环中实现读取头文件以确定头文件的结尾,但是没有任何可见效果,甚至没有显示检查中间结果的打印命令。 一旦我在'for line in f:'之后放了'print line',我想我可以看到出了什么问题,但看起来整个循环都被忽略了,包括break命令导致错误,因为文件已完成读取而没有数据留待读取其他部分...

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先,如果标题在每行的开头有一个特定字符,则可以使用它自动过滤标题。使用numpy,您可以使用numpy.loadtxt(filename, delimiter=";", comment="#")加载数据,而只会忽略以#开头的每一行。 我不知道这是不是这样的情况?!

如果您描述的情况是,您有一个标题结束标记#eoh,您可以先逐行读取标题,找出以后需要忽略的行数,然后使用该数字时加载文件。

我已经汇集了一个小例子,它是如何工作的。

def readFile(filename):
    #first find the number of lines to skip in the header
    eoh = 0
    with open(filename, "r") as f:
        for line in f:
            eoh = eoh+1
            if "#eoh" in line:
                break
    # now at this point we need to find out about the column names
    # but as no data is given as example, this is impossible
    columnnames = []            
    # load the file by skipping eoh lines,
    # the rest should be well behaving
    a = np.genfromtxt(filename, skip_header = eoh, delimiter=";" )

    return a, columnnames

def plot(a, columnnames, show=True, save=False, filename="something"):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    # plot the forth column agains the second
    ax.plot(a[:, 1], a[:,3])    
    # if we had some columnname, we could also plot
    # column named "ulf" against the one named "alf"
    #ax.plot(a[:, columnnames.index("alf")], a[:,columnnames.index("ulf")]) 

    #now save and/or show
    if save:
        plt.savefig(filename+".png")
    if show:
        plt.show()


if __name__ == "__main__": 
    fullpath = "path/to/files/file*.txt" # or whatever       
    for filename in glob.glob(fullpath):
        a, columnnames = readFile(filename)
        plot(a, columnnames, show=True, save=False, filename=filename[:-4])

剩下的一个问题是列的名称。由于您没有提供任何示例数据,因此很难估计如何准确地执行此操作。

这一切都假定您之间没有任何遗漏数据或任何此类数据。如果是这种情况,那么您需要使用numpy.genfromtxt()的所有参数来相应地过滤数据。