我有两个文件:
CL1 AA XX YY ZZ SS \n
CL2 3_b AA
AA string1
AA string2
3_b string3
CL1 AA string1
CL1 AA string2
CL2 3_b string3
CL2 AA string1
CL2 AA string2
为此,我写了以下代码:
import numpy as np
print("Reading Files...")
header = open('File1', 'r')
cl = header.readlines()
infile = np.genfromtxt('File2', dtype='str', skip_header=1)
new_array = []
for j in range(len(infile)):
for row in cl:
element = row.split("\t")
ele_size = len(element)
for i in range(0, ele_size):
if np.core.defchararray.equal(infile[j,0], element[i]):
clust = element[0]
match1 = infile[j,0]
match2 = infile[j,1]
combo = "\t".join([clust, match1, match2])
new_array.append(combo)
np.savetxt('output.txt',new_array, fmt='%s', delimiter='\t')
这会产生我想要的输出。但由于文件在file2和大约65000个集群中有大约700000行,因此迭代需要很长时间。任何人都可以提出一种有效的解析方法吗?
是否可以将第一个文件保留为列表,将第二个文件保存为字典?然后迭代键值?
答案 0 :(得分:1)
你应该为File2存储一个dict,然后当你在File1中遍历行时,你可以只查找File2 dict中的键。这意味着单个级别for
循环而不是三级for
循环。
我认为NumPy不会帮助你解决任何问题 - 更容易忽略它并且只是编写常规Python。我认为它最终会很快。
答案 1 :(得分:0)
你可能想要看起来像这样的东西:
from collections import defaultdict
data1 = '''CL1 AA XX YY ZZ SS
CL2 3_b AA'''.split('\n')
data2 = '''AA string1
AA string2
3_b string3'''.split('\n')
# Store mappings that look like
# * AA generates 'string1' and 'string2'
# * 3_b generates 'string3'
mapping = defaultdict(list)
for line in data2:
token, string = line.split() # you may need to change how you split the lines
mapping[token].append(string)
result = []
# line -> CL1 AA XX YY ZZ SS
# element ^^^
# tokens ^^ ^^ ^^ ^^ ^^
for line in data1:
element, *tokens = line.split()
for token in tokens[:2]: # you seem to only want 'match1' and 'match2'
for string in mapping[token]:
result.append([element, token, string])
for lst in result:
print('\t'.join(lst))
基本上,您预先将“File2”的内容存储在字典中,类似于:
{"AA": ["string1", "string2"], "3_b": ["string3"]}
然后循环遍历“File1”的每一行;提取前三个组成部分;对于后两者,请从您预先生成的字典中找到相应的字符串*值。
我同意其他用户的观点,认为numpy在这里不会超级有用。它可能只是增加了开销而没有真正的好处。