2013-07-19 69 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文件。 :) –