Python:使用不同类型的变量从文件中读取行

时间:2013-02-14 20:49:56

标签: python variables types try-except

尝试分析带有字典标题行的2列(color number_of_occurances).tsv文件。试图以最通用的方式跳过标题行(假设这是要求第二列为int类型)。以下是我提出的最好的,但似乎必须更好:

filelist = []
color_dict = {}
with open('file1.tsv') as F:
    filelist = [line.strip('\n').split('\t') for line in F]
for item in filelist:
    try: #attempt to add values to existing dictionary entry
        x = color_dict[item[0]]
        x += int(item[1])
        color_dict[item[0]] = x
    except: #if color has not been observed yet (KeyError), or if non-convertable string(ValueError) create new entry
        try:
            color_dict[item[0]] = int(item[1])
        except(ValueError): #if item[1] can't convert to int
            pass

似乎应该有更好的方法来处理trys和exception。

按要求摘录文件:

color Observed
green 15
gold 20
green 35

2 个答案:

答案 0 :(得分:4)

您是否可以通过将列表切割为[1:]来跳过列表中的第一个元素:

filelist = [line.strip('\n').split('\t') for line in F][1:]

现在,fileList根本不包含第一行的元素,即标题行。

或者,正如@StevenRumbalski在评论中指出的那样,您可以在列表理解之前完成next(F, None),以避免在第一个元素之后复制您的列表:

with open('file1.tsv') as F:
    next(F, None)
    filelist = [line.strip('\n').split('\t') for line in F]

此外,如果你在这里使用defaultdict会更好。

像这样使用:

from collections import defaultdict
color_dict = defaultdict(int)

这样,在操作之前,您不必检查key是否存在。所以,您可以这样做:

color_dict[item[0]] += int(item[1])

答案 1 :(得分:2)

在这种情况下,我会使用defaultdict。因为,当第一次遇到每个密钥时,它不在映射中;所以会自动创建一个条目。

 from collections import defaultdict
 color_dict = defaultdict(int)
 for item in filelist:
       color_dict[item[0]] += int(item[1])