2012-03-22 69 views
9

我的一位朋友需要讀取很多數據(大約18000個數據集),這些數據都格式化令人討厭。具體來說,數據應該是8列和8000行數據,但是相反,數據是以7列傳遞的,最後一個入口溢出到下一行的第一列。Python:如何讀取列數不均的數據文件

另外每〜30行只有4列。這是因爲一些上游程序正在將200 x 280陣列重塑爲7x8120陣列。

我的問題是:我們如何將數據讀入8x7000陣列。當列數不一致時,我通常的np.loadtxt和np.genfromtxt庫失敗。

請記住,性能是一個因素,因爲必須對〜18000個數據文件進行處理。

下面是一個典型的數據文件的鏈接: http://users-phys.au.dk/hha07/hk_L1.ref

+0

澄清:每24行有一列4行,因爲八列繼續「溢出」到每一行中。對?每個24 * 7 + 4的塊有200個項目,可以被8整除。 – 2012-03-22 13:22:44

+1

一個例子會非常有用。 – 2012-03-22 13:29:50

+1

如何修復上游程序輸出漂亮的HDF5文件,或者至少比這更瘋狂? – 2012-03-22 14:24:04

回答

11

一個更簡單的方法,我只是想的:

with open("hk_L1.ref") as f: 
    data = numpy.array(f.read().split(), dtype=float).reshape(7000, 8) 

這首先讀取數據作爲一維數組,完全無視所有新行字符,然後我們把它重新塑造成所需的形狀。

雖然我認爲這個任務無論如何都是I/O約束的,但如果它很重要的話,這種方法應該使用很少的處理器時間。

0

這個怎麼樣?

data = [] 
curRow = [] 
dataPerRow = 8 
for row in FILE.readlines(): 
    for item in row.split(): 
     if len(curRow) == dataPerRow: 
      data.append(curRow) 
      curRow = [] 
     curRow.Append(item) 

data.append(curRow) 

(假設文件被讀入文件) 然後,您有名單,其可用於任何列表。

1

提供我理解正確的話,你(見我的意見),你可以分割你的輸入令牌,然後對其進行處理的八隱約塊:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

f = open('filename.ref') 
tokens = f.read().split() 

rows = [] 
for idx, token in enumerate(tokens): 
    if idx % 8 == 0: 
     # this is a new row, use a new list. 
     row = [] 
     rows.append(row) 
    row.append(token) 

# rows is now a list of lists with the desired data. 

這將運行在低於​​0.2秒,我的計算機是。

編輯:使用@ SvenMarnach的建議。

+0

你爲什麼在這裏使用'shlex'?一個簡單的'str.split()'可以做到這一點。 – 2012-03-22 13:43:39

+0

@SvenMarnach:我認爲這很容易,因爲它從文件中呈現出層出不窮的令牌。使用'line.split()'我必須自己迭代文件,跟蹤由OP描述的8列7問題引起的當前偏移量。不管是那個還是寫一個發生器,我想,但這正是我在這裏使用shlex的原因。如果我沒有關注,請讓我知道! – 2012-03-22 13:50:51

+0

只需使用'f.read()。split()',就完成了。 – 2012-03-22 13:52:31