2010-09-10 20 views
6

'u yinelemek için dizgiyi int için forma dönüştürün int işlevini şu anda sahip olduğu dizelerin tuple'lerine eşlemek zorunda değilim.python csv reader -

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 

Ne yapmak istiyorum böyle bir şeydir: Benim örnek son bölümünü görün

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  

Bunu denemek ve aşağıdaki hatayı alıyorum:

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

ben Sorun yaşıyorum bu hata mesajını anlıyorum. Okuyucunun yinelenen bir nesne olduğunu düşündüm - bir liste değil. Her yineleme için bir liste döndürür, ancak kendisi bir liste değildir, doğru mu? Sanırım bu daha çok bir yan soru. Gerçekten bilmek istediğim, yapmaya çalıştığım şeyi yapmanın bir yolu varsa. Gerçekten alakalı olmayan kod için üzgünüm, ama bütün örneğimi içerebileceğimi düşündüm. Parçalara ayırmaktan çekinmeyin! :) Anahtarın, bu iç içe geçmiş sözlük parçaları yerine bir tuple olduğu bir dict'ın olması daha iyi olabilir mi diye merak ediyorum, ama yine de, sorumu bulmakla ilgileniyorum.

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  

Bu sadece okuyucuyu sarmak ve tamsayılar girdi dönüştürmek için bir jeneratör işlevini kullanmaktır: gibi

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

Kodunuz sonra görünecektir:

cevap

8

ne istedikleri gibi bir şeydir.

TypeError kökeni reader bir jeneratör işlevi değerleri yield s listeleri olmasıdır. map uygulandığında, listelerin bir listesini 'map uygularsınız. Bu, map'u uzun yoldan yazarken yaptığınız değerlerin listesine uygulamaktan farklıdır.

Gösterim amacıyla, bunu yapmak için başka bir yol Bu sadece bir fonksiyon tanımlama yerine in situ jeneratör ekspresyonunda bir kullanan

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

olup. Bu bir tat meselesi.

+0

bu harika. Sadece jeneratörler hakkında bir şeyler okuyordum ve bu da onları daha iyi anlamama yardımcı oluyor! toplam noob/fanboy gibi davrandığım için üzgünüm, ama python'a girmeye başlıyorum ve bu çok harika. – oob

+0

@oob. Terleme. Alabildiğim tüm hayranları kullanabilirim. Oh bekle .... python hakkında konuşuyordun. Evet, pitonlar da oldukça havalı. – aaronasterling