2017-06-05 70 views
0

我想從一個txt文件,看起來像這樣在數據讀取:Python中是否有一種快速讀取文件中的數據的方法,用空行分隔?

# 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的,我看我的數據,並通過空行分開呢?

回答

1

您可以使用groupbyitertools模塊和literal_evalast模塊做類似的事情。

假設你的輸入文件被稱爲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

您可以在不導入外部模塊的情況下實現相同的結果。

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] 
相關問題