2012-04-12 70 views
5

我使用python和numpy從文本文件中的數值模型讀取數據,格式相當複雜。Python:用numpy讀取複雜的文本文件

Numpy的genfromtxt和fromfile函數很好地工作,但前提是數據是結構化的。我的數據文件看起來是這樣的:

------剪斷

[sitename] [dimemsion 1 size] [dimension 2 size] 
[data for dim 1] 
[data for dim 2] 
[date/time] 
[header data] 
[data (dim1 * dim2)] 
[header] 
[data] 
... 
. 
. 
[data/time] 
[header] 
[data] 
. 
. 
etc... 

----剪斷

所以,我有文本和數字和複雜的混合物(但重複)佈局。如何使用numpy閱讀這個最好的方法?

乾杯,

克里斯

+1

你需要使用'numpy的容易多了只有方法?也許閱讀部分可以用普通的Python來完成。 – 2012-04-12 21:37:17

回答

5

numpy的是不擅長廣義解析,所以你會做得很好,超越它,你選擇將主要取決於文件的方式是一致的。

如果它們超乎尋常地超一致,那麼說,你可以從已知位置和已知行中提取數字,而不是隻能在文件中逐行讀取作爲刺痛並將其索引到您的角色想。 (遍歷文件,例如使用file.readlines將每行作爲一個字符串。)

通常情況下(至少我發現)是它比上面更多樣化,但是簡單的字符串操作可以是用於解析該行,如string.split(這幾乎總是我的第一步)等。

除此之外,Python中有很多解析庫。我偏好pyparsing(但我不太瞭解其他人,所以這不是一個公平的比較)。這裏是a summary of the various parsing libraries

+0

用於pyparsing。這絕對是這裏工作的正確工具。 – 2012-04-13 00:04:21

+0

謝謝 - 我會給pyparsing一個嘗試。因爲它是基於python(而不是像numpy.fromfile這樣的c模塊),我想它會比使用numpy慢得多? Chris – ccbunney 2012-04-13 12:26:37

+0

是的,pyparsing比numpy.fromfile要慢得多,至少從我的經驗來看。我認爲它也做得更多。此外,雖然它是一個很好的圖書館,但需要一些學習。出於這個原因,我建議首先嚐試一下基本的字符串操作,因爲這些操作通常都是這樣做的,如果這些操作不起作用,請轉到pyparsing(除非,當然,您還是想學習pyparsing )。 – tom10 2012-04-13 15:52:31

1

我同意上一個答案。下面的步驟鏈效果最好,比pyparsing或numpy.genfromtxt

inp = open(textfilename).readlines() 
my_list = [] 
for line in inp: 
    item = str.split(line) 
    my_list.append(float(item[0])) 

然後,您可以輕鬆地在列表轉換成numpy的陣列/矩陣,並繼續從那裏