在Python中是否有一种快速的方法来读取文件中的数据,用空行分隔?

时间:2017-06-05 10:27:46

标签: python arrays list numpy

我想从txt文件中读取数据,如下所示:

# input data
50.  310.  3.0E-07  23.06
50.  310.5  2.4E-07  5.73

50.5  310.  2.9E-07  16.30
50.5  310.5  2.2E-07  4.26

51.  310.  2.3E-07  6.40
51.  310.5  2.7E-07  8.19

所以我有不同的块,每个块都有几行数据和四个值,所有块都以空行结束。

目前我用这样的numpy读入我的数据,这给了我一个来自所有不同块的每个值的数组。

 x,y,z,err = np.loadtxt(path_to_file, unpack=True)

但事实上,我真的很想获得每个值的列表列表,这样我就可以将每个块的数据分开,这通过数据文件中的空行表示。 结果,例如第三个值,应如下所示:

# the result i want to achieve
z_list = array([[3.0E-7, 2.4E-07],
   [2.9E-07, 2.2E-07],
   [2.3E-07, 2.7E-07]])

在Python或numpy中有没有办法读取数据并用空行分隔?

2 个答案:

答案 0 :(得分:1)

您可以使用groupby模块中的itertoolsliteral_eval模块中的ast来执行此类操作。

假设您的输入文件名为input_file

from itertools import groupby
from ast import literal_eval as le

data = []
with open('input_file', 'r') as f:
    data = (k.split() for k in f.read().splitlines())

final = []
for _,v in groupby(data, lambda x: x != []):
    bb = list(v)
    if bb != [[]]:
        final.append([le(k[2]) for k in bb])

print(final)

输出:

[[3e-07, 2.4e-07], [2.9e-07, 2.2e-07], [2.3e-07, 2.7e-07]]

然后,您可以将final list转换为numpy array或其他符合您需求的内容。

答案 1 :(得分:1)

您无需导入外部模块即可获得相同的结果。

def read_data(filename):
    """
    filename    :   "/Users/.../Desktop/.../filename.txt"
    """
    datafile = list(open(filename, 'r'))
    # 4 columns in your example 
    col_1, col_2, col_3, col_4 = [], [], [], []
    for col in datafile:
        data = col.split()
        col_1.append(float(data[0])) # 1st column
        col_2.append(float(data[1]))
        col_3.append(float(data[2]))
        col_4.append(float(data[3]))
    return col_1, col_2, col_3, col_4 

然后你可以像这样实现列表输出列表:

data_1, data_2, data_3, data_4 = read_data(filename)
data = [data_1, data_2, data_3, data_4]