我有一个非常大的 tsv 文件:1.5 GB。我想解析这个文件。我正在使用以下功能:
def readEvalFileAsDictInverse(evalFile):
eval = open(evalFile, "r")
evalIDs = {}
for row in eval:
ids = row.split("\t")
if ids[0] not in evalIDs.keys():
evalIDs[ids[0]] = []
evalIDs[ids[0]].append(ids[1])
eval.close()
return evalIDs
用了 10 多个小时,它还在工作。我不知道如何加速这一步以及是否有另一种方法来解析例如文件
请您参考如下方法:
这里有几个问题:
- 使用
if ids[0] not in evalIDs.keys()测试键在 python 2 中需要 forever,因为keys()是一个列表。.keys()无论如何都很少有用。一个更好的方法已经是if ids[0] not in evalIDs,但是,但是... - 为什么不使用
collections.defaultdict来代替? - 为什么不使用
csv模块? - 覆盖内置的
eval(好吧,看看它有多危险,这不是真正的问题)
我的建议:
import csv, collections
def readEvalFileAsDictInverse(evalFile):
with open(evalFile, "r") as handle:
evalIDs = collections.defaultdict(list)
cr = csv.reader(handle,delimiter='\t')
for ids in cr:
evalIDs[ids[0]].append(ids[1]]
神奇的 evalIDs[ids[0]].append(ids[1]] 创建一个 list 如果不存在的话。它也是可移植的并且非常快无论 python 版本是什么并保存一个 if
我认为使用默认库不会更快,但 pandas 解决方案可能会更快。
