我想从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中有没有办法读取数据并用空行分隔?
答案 0 :(得分:1)
您可以使用groupby
模块中的itertools
和literal_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]