2010-09-10 69 views
6

我感兴趣的是不必将int函数映射到我现在拥有它的字符串元组。见我的例子中的最后一部分:python csv reader - 迭代时将字符串转换为int的行

import os 
import csv 

filepath = os.path.normpath("c:/temp/test.csv") 

individualFile = open(filepath,'rb') 
dialect = csv.Sniffer().sniff(individualFile.read(1000)) 

individualFile.seek(0) 
reader = csv.reader(individualFile,dialect) 

names = reader.next() 

print names 

def buildTree(arityList): 
    if arityList == []: 
     return 0    
    else: 
     tree = {} 
     for i in xrange(arityList[0][0],arityList[0][1]+1): 
      tree[i] = buildTree(arityList[1:]) 
     return tree 


census = buildTree([(1,12),(1,6),(1,4),(1,2),(0,85),(0,14)]) 

for m, f, s, g, a, c, t in reader: 
    try: 
     m,f,s,g,a,c,t = map(int,(m,f,s,g,a,c,t)) 
     census[m][f][s][g][a][c] += t 
    except: 
     print "error" 
     print m, f, s, g, a, c, t 
     break 

我想要做的是这样的:

for m, f, s, g, a, c, t in map(int,reader): 
    try: 
     census[m][f][s][g][a][c] += t 
    except: 
     print "error" 
     print m, f, s, g, a, c, t 
     break  

我试试这个,我得到以下错误:

TypeError: int() argument must be a string or a number, not 'list' 

我无法理解这个错误信息。我认为读者是一个可迭代的对象 - 不是一个列表。它为每个迭代返回一个列表,但它本身不是一个列表,是正确的?我想这更像是一个侧面问题。我真正想知道的是,如果有办法做我想做的事。对不起,代码没有真正涉及,但我想我会包括我的整个例子。随意把它撕成碎片! :)我想知道是否最好只有一个字典,其中的关键是一个元组而不是这个嵌套字典的东西,但即使如此,我仍然对解决我的问题感兴趣。

回答

8

你想要的东西是一样的东西:

def int_wrapper(reader): 
    for v in reader: 
     yield map(int, v) 

您的代码将然后看起来像:

reader = csv.reader(individualFile,dialect) 
reader = int_wrapper(reader) 

# all that other stuff 

for m, f, s, g, a, c, t in reader: 
    try: 
     census[m][f][s][g][a][c] += t 
    except: 
     print "error" 
     print m, f, s, g, a, c, t 
     break  

这仅仅是使用生成函数包读写器和输入转换为整数。

TypeError的来源是readeryield的值列表的生成器函数。当您向其申请map时,您正在将map应用于列表的“列表”。这与将map应用于长时间写出的值列表不同。

为了说明,另一种方式来做到这一点是

for m, f, s, g, a, c, t in (map(int, v) for v in reader): 
    # code 

这只是原位发生器表达式使用一个代替定义一个函数的。这是一个品味问题。

+0

这太棒了。我只是在阅读有关发电机,这有助于我更好地了解它们!对不起,像一个完全noob/fanboy,但我刚刚开始进入蟒蛇,它是如此可怕的真棒。 – oob 2010-09-10 05:02:32

+0

@oob。不要冒汗。我可以使用我可以获得的所有粉丝。哦,等等......你在谈论python。是的,蟒蛇也很酷。 – aaronasterling 2010-09-10 05:06:27