比较CSV文件中的列中的条目并提取匹配的-python

时间:2012-02-28 03:20:00

标签: python csv compare hash

我有两个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都是从更复杂的文件中解析出来的。

3 个答案:

答案 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中的前三个字段执行包含测试,这比您的假设实现快得多。