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

Python:使用不同类型的变量从文件中读取行,python,variables,types,try-except,Python,Variables,Types,Try Except,正在尝试分析一个2列(颜色编号为)的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

正在尝试分析一个2列(颜色编号为)的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
似乎应该有更好的方法来处理尝试和异常

按请求摘录的文件:

观察到的颜色
绿色15

gold 20


green 35

难道你不能像这样将列表切片为
[1:][/code>来跳过列表中的第一个元素吗:

filelist = [line.strip('\n').split('\t') for line in F][1:]
with open('file1.tsv') as F:
    next(F, None)
    filelist = [line.strip('\n').split('\t') for line in F]
现在,
fileList
将根本不包含第一行的元素,即标题行

或者,正如@StevenRumbalski在评论中指出的,您可以在理解列表之前简单地执行
next(F,None)
,以避免在第一个元素之后复制列表,如下所示:

filelist = [line.strip('\n').split('\t') for line in F][1:]
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)
这样,在对其进行操作之前,您不必检查
键是否存在。因此,您可以简单地执行以下操作:

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

难道你不能像这样将列表切片为
[1://code>来跳过列表中的第一个元素吗:

filelist = [line.strip('\n').split('\t') for line in F][1:]
with open('file1.tsv') as F:
    next(F, None)
    filelist = [line.strip('\n').split('\t') for line in F]
现在,
fileList
将根本不包含第一行的元素,即标题行

或者,正如@StevenRumbalski在评论中指出的,您可以在理解列表之前简单地执行
next(F,None)
,以避免在第一个元素之后复制列表,如下所示:

filelist = [line.strip('\n').split('\t') for line in F][1:]
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)
这样,在对其进行操作之前,您不必检查
键是否存在。因此,您可以简单地执行以下操作:

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

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

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

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

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

查看输入文件的示例会很有帮助……为什么使用
项[2]
而不是
项[1]
?因为在一个制表符上拆分一个
制表符
分隔行只会给出两个元素列表。是否总是有一行标题?如果是这样,只需将
next(F)
放在列表理解之前。(当然,我不确定你是否需要理解列表,因为你所做的似乎只是重复列表。)@RohitJain抱歉,这是一个打字错误,对编码还是相当陌生。当我从我的脚本中重新键入代码时,我在想“第二”列。项目[1]是正确的,应该已经使用过。查看输入文件的示例会很有帮助……为什么使用
项目[2]
而不是
项目[1]
?因为在一个制表符上拆分一个
制表符
分隔行只会给出两个元素列表。是否总是有一行标题?如果是这样,只需将
next(F)
放在列表理解之前。(当然,我不确定你是否需要理解列表,因为你所做的似乎只是重复列表。)@RohitJain抱歉,这是一个打字错误,对编码还是相当陌生。当我从我的脚本中重新键入代码时,我在想“第二”列。第[1]项是正确的,应该已经使用过。不知道defaultdict,非常好<代码>(int)项[2]
应编辑为
int(项[2])
。(而且索引可能不正确,因此将其更改为
1
)。不知道
defaultdict
,非常好<代码>(int)项[2]
应编辑为
int(项[2])
。(而且索引可能不正确,因此将其更改为
1
)。
next(F)
比通过切片创建列表的另一个副本要好,尤其是在源文件较大的情况下。您的意思是:
[line.strip('\n').split('\t')用于next(F)中的行)
?否。作为列表理解之前的行。它将迭代器前进到文件的第二行。@StevenRumbalski。啊!!当然我不知道。发电机的事情对吗?我会加上的。是的。另外,您还需要在默认dict赋值上使用
+=
next(F)
比通过切片创建列表的另一个副本要好,尤其是在源文件较大的情况下。您的意思是:
[line.strip('\n').split('\t')用于next(F)中的行)
?否。在理解列表之前作为一行。它将迭代器前进到文件的第二行。@StevenRumbalski。啊!!当然我不知道。发电机的事情对吗?我会加上的。是的。此外,您还需要在默认dict分配上设置
+=