python csv reader在迭代时将for行上的字符串转换为int

2024-05-16 22:20:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我对不必将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'

我很难理解这个错误信息。我认为读者是一个可接受的对象,而不是一个列表。它为每个迭代返回一个列表,但它本身不是一个列表,对吗?我想这是个次要的问题。我真正想知道的是,有没有办法做我想做的事。抱歉,代码没有真正的联系,但我想我会包括我的整个例子。你可以把它撕成碎片!:)我想知道,如果只使用一个dict,其中的键是一个元组,而不是这个嵌套字典的东西,可能会更好,但即使如此,我仍然有兴趣找出我的问题。


Tags: csvinimporttree列表forosreader
1条回答
网友
1楼 · 发布于 2024-05-16 22:20:19

你想要的是:

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的起源是reader是一个生成函数,它列出了yield的值。当你对它应用map时,你就是在对一个“列表”应用map。这不同于将map应用于一个值列表,当您将它写得很长时,您会执行这个操作。

为了说明这一点,另一种方法是

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

这只是使用原位生成器表达式,而不是定义函数。这是口味的问题。

相关问题 更多 >