2013-05-29 37 views
2

在我的data.txt文件中,有兩種類型的行。numpy - Python - 選擇性地導入.txt文件的一部分

  1. 正常數據:16個數字用空格分隔,最後加上'\ n'。

  2. 不完整的數據:在將數據寫入data.txt的過程中,最後一行的寫入總是被STOP命令中斷。因此,它始終是不完整的,e.g.it可以有10個號碼,並沒有 '\ n'

兩個問題:

一個。除了最後一個不完整的行到Python之外,我怎樣才能導入整個文件?

我注意到

# Load the .txt file in 
myData = np.loadtxt('twenty_z_up.txt') 

是相當「嚴厲」的意義上,當最後一個不完整的行存在在那裏,該文件無法導入。導入的.txt文件必須是一個很好的矩陣。

有時候,我會在實驗目的的第一行中輸入時間戳。假設我在第2行的開頭有我的第一個時間戳,並且在第5行的開頭有我的第2個標記。如何僅將第2行導入到第5行的Python?

===============================更新:Qa已解決========= =======================

myData = np.genfromtxt('fast_walking_pocket.txt', skip_footer=1) 

將有助於放棄最後的不完全排

+2

嘗試'NP .genfromtxt' – wim

+0

@wim太棒了!問題解決了。但Q.b呢?我已經閱讀了np.genfromtxt的文檔,但仍然不知道...... –

+0

'numpy'不帶有Qb的內置解決方案。你必須以某種方式預處理你的數據文件,然後將解析結果提供給'np.loadtxt'或'np.genfromtxt'(如果有幫助的話,它們接受'StringIO'作爲輸入)。解析步驟就像'對於f的每一行,如果它不是日期,則產生該行;如果是,請在那裏停留,但標記我們在哪裏'... –

回答

1

要回答你的 'b' 的問題。

假設你有這樣的文件(稱爲 '/tmp/lines.txt'):

line 1 
2013:10:15 
line 3 
line 4 
2010:8:15 
line 6 

可以使用linecache模塊:

>>> import linecache 
>>> linecache.getline('/tmp/lines.txt', 2) 
'2013:10:15\n' 

這樣你就可以直接解析這一次:

>>> import datetime as dt 
>>>dt.datetime.strptime(linecache.getline('/tmp/lines.txt',2).strip(),'%Y:%m:%d') 
datetime.datetime(2013, 10, 15, 0, 0) 

編輯

多行:

>>> li=[] 
>>> for i in (2,5): 
... li.append(linecache.getline('/tmp/lines.txt', i).strip()) 
... 
>>> li 
['2013:10:15', '2010:8:15'] 

或者:

>>> lines={} 
>>> for i in (2,5): 
... lines[i]=linecache.getline('/tmp/lines.txt', i).strip() 
... 
>>> lines 
{2: '2013:10:15', 5: '2010:8:15'} 

或一個範圍:

>>> lines={} 
>>> for i in range(2,6): 
... lines[i]=linecache.getline('/tmp/lines.txt', i).strip() 
... 
>>> lines 
{2: '2013:10:15', 3: 'line 3', 4: 'line 4', 5: '2010:8:15'} 
+0

好的。這對於SINGLE線路來說非常棒。但是如果我想將第2行一直提取到第15行呢? –

3

你可以嘗試pandas它提供了一個使用功能read_csv加載數據更容易。

示例數據:

a b c d e f g h i j k l m n o p 
a b c d e f g h i j k l m n o p 
a b c d e f g h i j k l m n o p 
a b c d e f g h i j k l m n o p 
a b c d e f g h i j k l m n o p 
a b c d e f g h i j 

爲了您的Q1,您可以通過加載數據:

In [27]: import pandas as pd 

In [28]: df = pd.read_csv('test.txt', sep=' ', header=None, skipfooter=1) 

DataFrame是一個有用的結構,它可以幫助你 處理數據更容易。要獲得一個numpy數組,只需獲取DataFramevalues屬性即可。

In [33]: df.values 
Out[33]: 
array([['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p'], 
     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p'], 
     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p'], 
     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p'], 
     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p']], dtype=object) 

爲了您的Q2,你可以得到第二和

In [36]: df.ix[[1, 4]] 
Out[36]: 
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
1 a b c d e f g h i j k l m n o p 
4 a b c d e f g h i j k l m n o p 
1

問題上的第五行:

np.genfromtxt('twenty_z_up.txt',skip_footer=1) 

Qustion B:

np.genfromtxt('twenty_z_up.txt',skip_footer=1)[2:5]