2016-11-11 52 views
-1

我有很多数据文件名称未知。我已经想出了一种让他们全部阅读和打印的方法,但是我想制作它们的图表,因此我需要以可行的方式获取数据。读取未知名称文件的选定部分

数据文件非常整齐地排列(标题的每一行都包含有关存储在那里的信息),但是我无法制作一个脚本来选择我需要的数据。

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. 

但头下方还有人数不详的数据块:第一个50+行的文件包含标题,而我只需要使用一些,使用的东西这样当不成问题的列和未确定的行数(标题中指定了列数和每列是什么)。这个我不能通过例如matplotlib来创建图表来读取。 (我可以通过手动将数据复制到单独的文件并将其读取为可绘制的格式,但这不是我想要每次执行每个文件时都要做的事情......)数据开始之前的行包含非常有用的内容#eoh,但我无法想出一种方法来结合前50行的选择性阅读,然后开始将所有内容读入数组。如果有方法以更好的方式做我想做的事情(包括选择地图并查看哪些文件存在并可读),我乐意提供建议。

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

#COLUMNINFO = NUM​​BER1,UNIT,测量,NUMBER2

在该格式中数字1是可以得到columnnumber,单位是测量单位,测量是什么被测量和NUMBER2在数量上是什么测量。 数据由空格分隔,但这不会成为问题,我怀疑。

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

任何帮助,将不胜感激。

+2

你看过“熊猫”吗?在列中排列数据时非常有帮助,而且非常容易* matplotlib * –

回答

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()的所有参数来相应地过滤数据。

+0

看起来不错,因为这是我的一个侧面项目,我现在没有时间去实现它,但它看起来很像非常有前途。我特别喜欢'def'部分,因为我没有意识到它或Python中存在的类似东西。 – TomH