【问题标题】:Python: way to read data from multiple files into 2D numpy array or listPython:将数据从多个文件读入二维 numpy 数组或列表的方法
【发布时间】:2014-09-05 20:04:58
【问题描述】:

我有n 个文件,我想从每个文件中特定行的m 个列中读取数据。我想得到一个n by m 列表或数组,其中列表或数组的每一行都是其中一个文件中的一行。有什么方法可以做到这一点?或者这甚至是最好的方法吗?我可以定义m 不同的列表或数组(每个都有相似的名称,可能只是用数字索引)但是处理几个不同的列表或数组似乎比处理一个二维的列表或数组更困难和复杂。

比如……

file_names = ( "file1" "file2" "file3" "file4" ) # so in this case n is 4
for name in file_names do:
    ###  somehow save the m columns as a row in an array or list
print resulting_list_or_array

一些可能相关的注释:我想从文件中读取的m 列不是文件中的第一个m 列(假设我需要跳过skip_num 列,我确实知道@ 987654330@ 和 m 是。

另外,我要读取的行不是第一行,而是row_num 行。

【问题讨论】:

    标签: python arrays list numpy


    【解决方案1】:

    您可以使用内置模块globnumpy.genfromtxt 编写通用代码,如下例所示,其中许多test*.txt 文件的第二行将在末尾构建一个二维数组:

    from glob import glob
    
    import numpy as np
    
    def read(fname, skip_header=1):
        with open(fname) as f:
            for i in range(skip_header):
                f.next()
            return f.next()
    
    a = np.genfromtxt((read(fname) for fname in glob('test*.txt')))
    

    【讨论】:

    • glob 一个标准模块,通常与 Python 一起安装(例如,如果我在我的 Linux 机器上在 Python 中运行 from glob import glob 它最有可能工作)还是我必须自己安装它?
    • @Joshua 是的...glob 是标准模块...您尝试过这个答案吗?
    • 还没有。如果我想读取文件中的特定行,我是否只需要循环 f.next() 到达该行所需的次数?
    • @Joshua 正确...我已将答案编辑为更通用,使用与 numpy.genfromtxt 相同的命名法
    【解决方案2】:

    您的问题似乎很明确

    result = []
    
    file_names = ("file1", "file2", "file3", "file4")
    for name in file_names do:
        f = open(name)
        for i, line in enumerate(f):
            if i == 122: # note this will be line_no + 1
                data = line.strip().split()
                result.append([data[0], data[5], data[6], data[9]])
    
    print result # a dynamically created 2D array
    

    【讨论】:

    • 如果我想读取不是第一行的特定行怎么办?我在上面编辑了我的问题以反映这一点。
    • 这就是enumerateif 语句正在做的事情。
    • 如果m 是 40 怎么办?看起来,在您以result.append 开头的行中,具体列出每个元素会很笨拙。像result.append([data[skip_num:skip_num + m] ]) 这样的东西有用吗?
    猜你喜欢
    • 2021-02-06
    • 2018-06-26
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多