2010-09-10 43 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