Python:使用不同类型的变量从文件中读取行
正在尝试分析一个2列(颜色编号为)的tsv文件,该文件的标题行带有字典。尝试以最通用的方式跳过标题行(假设这是通过要求第二列为int类型)。以下是我想到的最好的,但似乎还有更好的: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
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分配上设置+=
。