2013-07-19 66 views
1

我正在創建一個腳本,以便將csv文件從其列標題讀入一組命名元組中。然後,我將使用這些命名的數據來提取符合特定條件的數據行。將命名元組的值從字符串轉換爲整數

我已經制定了輸入(如下所示),但是在將數據輸出到另一個文件之前過濾數據時遇到問題。是

import csv 
from collections import namedtuple 

with open('test_data.csv') as f: 
    f_csv = csv.reader(f) #read using csv.reader() 
    Base = namedtuple('Base', next(f_csv)) #create namedtuple keys from header row 
    for r in f_csv: #for each row in the file 
     row = Base(*r) 
     # Process row 
     print(row) #print data 

我的輸入文件的內容如下:

Locus   Total_Depth  Average_Depth_sample Depth_for_17 
chr1:6484996 1030   1030     1030 
chr1:6484997 14    14      14 
chr1:6484998 0    0      0 

而且他們從我的代碼打印爲如下:

基地(軌跡= 'CHR1:6484996', (Locus ='chr1:6484997',Total_Depth = '14', Average_Depth_sample = '14',Depth_for_17 = '14')(平均值='1030', Average_Depth_sample ='1030',Depth_for_17 ='1030') 基地(軌跡= 'CHR 1:6484998',Total_Depth = '0',Average_Depth_sample = '0', Depth_for_17 = '0')

我希望能夠用Total_Depth拉出僅記錄大於15

直觀我嘗試以下功能:

if Base.Total_Depth >= 15 : 
    print row 

然而,這僅打印數據的最終行(從上面的輸出表格)。我認爲這個問題是雙重的。據我所知,我不會將我的命名元組存儲在任何地方,以便稍後引用它們。其次,數字正在以字符串格式而不是整數讀取。

首先有人可以糾正我,如果我需要將我的namedtuples存儲在某處。

第二,如何將字符串值轉換爲整數?或者這是不可能的,因爲namedtuples是不可變的。

謝謝!

I previously asked a similar question關於字典,但現在想用namedtuples代替。 :)

回答

3

地圖你的價值觀,以int創建命名元組實例時:

row = Base(r[0], *map(int, r[1:])) 

這使r[0]值作爲一個字符串,其餘值映射到int()

This does需要了解可以轉換爲整數的CSV列的知識,這裏是硬編碼的。

演示:

>>> from collections import namedtuple 
>>> Base = namedtuple('Base', ['Locus', 'Total_Depth', 'Average_Depth_sample', 'Depth_for_17']) 
>>> r = ['chr1:6484996', '1030', '1030', '1030'] 
>>> Base(r[0], *map(int, r[1:])) 
Base(Locus='chr1:6484996', Total_Depth=1030, Average_Depth_sample=1030, Depth_for_17=1030) 

請注意,您應該測試對行,而不是Base類:

if row.Total_Depth >= 15: 

內環路,或收集行的新的循環。

+0

謝謝。我可以看到這將後三個命名的元素(相當於我的電子表格列)輸出爲整數。但是,當我嘗試使用我的if語句來過濾它們時,它仍然只會拖出Total_Depth = 0的那個。這是因爲我的if語句在第一個函數之外? –

+2

@s_boardman:更新; 'Base.Total_Depth'是一個屬性對象,不是一個整數;您可能正在尋找'row.Total_Depth'。 –

+0

太好了,非常感謝!現在使用namedtuple鍵作爲列標題將它們輸出到一個新的CSV文件。 :) –