【问题标题】:Python: reading line from file with different types of variablesPython:从具有不同类型变量的文件中读取行
【发布时间】:2013-01-30 18:48:52
【问题描述】:

尝试分析 2 列(颜色 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

似乎应该有更好的方法来处理尝试和异常。

请求的文件摘录:

color Observed
green 15
gold 20
green 35

【问题讨论】:

  • 查看输入文件的样本会很有帮助...
  • 你为什么用item[2]而不是item[1]?由于在选项卡上拆分 tab 分隔线只会给出 2 个元素列表。
  • 标题总是一行吗?如果是这样,只需将next(F) 放在您的列表理解之前。 (当然,我不确定您是否需要列表理解,因为您似乎所做的只是遍历列表。)
  • @RohitJain 对不起,这是一个错字,当我从我的脚本在这里重新输入代码时,编码仍然是相当新的思考“第二”列。 item[1] 是正确的,应该被使用过。

标签: python variables types try-except


【解决方案1】:

你不能通过像这样将列表切片为[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])

【讨论】:

  • next(F) 比通过切片创建列表的另一个副本要好,尤其是在源文件很大的情况下。
  • 你的意思是:[line.strip('\n').split('\t') for line in next(F)]?
  • 没有。作为列表理解之前的一行。它将迭代器前进到文件的第二行。
  • @StevenRumbalski。啊!当然。不知道那个。发电机的事吧?将添加它。
  • 是的。此外,您需要 += 在默认的 dict 分配中。
【解决方案2】:

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

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

【讨论】:

  • 不知道defaultdict,很好!
  • (int) item[2] 应编辑为int(item[2])。 (并且索引可能不正确,因此将其更改为1)。
猜你喜欢
  • 1970-01-01
  • 2016-05-14
  • 2014-06-20
  • 1970-01-01
  • 2016-02-04
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多