我有两个CSV文件(三列),我需要比较并从其他匹配的文件(五列)中提取行。文件的示例是:
File1中:
ATGCGCGACAGT, ch3, 123546
ATGCATACAGGATAT, ch2, 5141561615
......大约有100个条目
文件2:
ATGCGGCGACAGT,ch3, 123456,mi141515, AUCAGCUAUAUAU, UACGCAGAUAUAUA
ATCAGACGATTATGA, ch4, 4564764, mi653453, AUCAGCAAUUUUCG, AUACAGACAAAAA
....所以大约有50000个条目
我需要匹配两个文件的第1,2和3列,这样file1的所有三列都应该与file2匹配。如果发生这种情况,则提取4,5和6列进行进一步处理。
我在考虑:
fhout=csv.writer(open('parsed_out', 'w'), delimiter=',')
for i in file1:
a=[0]
b=[1]
c=[2]
for x in file2:
d=[0]
e=[1]
f=[2]
g=[3]
h=[4]
i=[5]
if a==d and b==e and c==f:
fhout.writerow([g]+[h]+[i])
else:
pass
但有人告诉我,我可以使用散列或更好的方法,而不是在file1中为10,000或更多条目编写这么大的循环
请建议我更好地实现这一目标。文件1和文件2都是从更复杂的文件中解析出来的。
答案 0 :(得分:4)
下面根据您的建议使用第一个文件的set comprehension创建哈希:
S = {tuple(line) for line in csv.reader(File1)}
然后在读取第二个文件时,查找速度会快得多。
for line in csv.reader(File2):
key = tuple(line[:3])
if key in S:
print(line)
答案 1 :(得分:3)
尝试类似:
import csv
file_1_tuples = []
with open("file_1.csv") as fh:
csv_reader = csv.reader ( fh )
for row in csv_reader:
file_1_tuples.append( tuple(row) )
with open("file_2.csv") as fh:
csv_reader = csv.reader ( fh )
for row in csv_reader:
if tuple(row[0:3]) in file_1_tuples:
print ( row[3:6] )
使用以下数据运行时:
file_1.csv
person, john, smith
person, anne, frank
person, bob, macdonald
fruit, orange, banana
fruit, strawberry, fields
fruit, ringring, banana
file_2.csv
person, john, smith, 1, 2, 3
person, anne, frank, 4, 5, 6
person, bob, macdonald, 7, 8, 9
它产生输出
[' 1', ' 2', ' 3']
[' 4', ' 5', ' 6']
[' 7', ' 8', ' 9']
编辑:使用集合和列表推导的更好的实现:
import csv, pprint
with open("file_1.csv") as fh:
csv_reader = csv.reader ( fh )
file_1_tuples = { tuple(row) for row in csv_reader }
with open("file_2.csv") as fh:
csv_reader = csv.reader ( fh )
matched_rows = [ row for row in csv_reader if (tuple(row[:3]) in file_1_tuples)]
pprint.pprint (matched_rows)
编辑2:请注意,此实现对CSV文件中的空白区域很敏感。如果CSV文件中的间距不一致,请使用row = [element.strip(' ') for element in row]
之类的内容删除所有空格。
答案 2 :(得分:2)
将文件1中的字段放在元组中,然后将每个元组添加到一个集合中。然后,您可以对集合中文件2中的前三个字段执行包含测试,这比您的假设实现快得多。