大型CSV文件中特定列的部分交集

时间:2015-03-05 22:38:16

标签: python csv intersection

我正在编写一个脚本,根据每个文件中两个特定列的内容查找大型csv文件之间的交集:查询ID和主题ID。

一组文件是每个物种的左和右对,每个文件看起来像这样:

Similarity (%)  Query ID    Subject ID
100.000000  BRADI5G01462.1_1    BRADI5G16060.1_36
90.000000   BRADI5G02480.1_5    NCRNA_11838_6689
100.000000  BRADI5G06067.1_8    NCRNA_32597_1525
90.000000   BRADI5G08380.1_12   NCRNA_32405_1776
100.000000  BRADI5G09460.2_17   BRADI5G16060.1_36
90.909091   BRADI5G10680.1_20   NCRNA_2505_6156

正确的文件始终的尺寸比左边的文件更长更大!!

这是我到目前为止的代码段:

import csv
with open('#Left(Brachypodium_Japonica).csv', 'r',newline='') as Afile, open('#Right(Brachypodium_Japonica).csv', 'r',newline='') as Bfile, open('Intrsc-(Brachypodium_Japonica).csv','w',newline='') as Intrsct:
    reader1=csv.reader(Afile,delimiter="\t",skipinitialspace=True)
    next(reader1,None)
    reader2=csv.reader(Bfile,delimiter="\t",skipinitialspace=True)
    next(reader2,None)
    Intrsct = csv.writer(Intrsct, delimiter="\t",skipinitialspace=True)
    Intrsct.writerow(["Query ID","Subject ID","Left Similarity (%)","Right Similarity (%)"])
    for row1 ,row2 in zip(Afile,Bfile):
            if ((row1[1] in row2[1] and row1[2] in row2[2])):
                Intrsct.writerow([row1.strip().split('\t')[1],row1.strip().split('\t')[2],row1.strip().split('\t')[0],row2.strip().split('\t')[0]])

上述代码模拟地遍历两个文件的记录,并搜索第(2)行,(1)行(2)的行(2),第二文件的行(2)的内容;按列顺序(比较两个文件中的查询ID以及主题ID)并按特定顺序在新文件上打印匹配。

结果并不完全符合我的预期;显然它只找到第一个想要的列的匹配...我试图手动追溯过程并发现BRADI5G02480.1_5例如存在于两个文件中但不存在NCRNA_11838_6689仅存在于左侧< strong>不正确!!

除了数值之外,他们应该是镜像反射吗?!

我已经使用this线程来编写脚本,但是它逐行比较并且不会检查剩余的列内容是否匹配。

另外,我找到了this,但它使用的词典和列表并不适合我文件的大小。

为了处理我使用this线程的模拟迭代事物,但是那里提到的关于处理变体大小文件的内容对我来说并不是很清楚,所以我还没试过它! / p>

如果有人能告诉我这里缺少什么,代码是否正确或我使用in条件错误了,我真的很感激!

拜托,我真的需要帮助 ...提前谢谢:)

1 个答案:

答案 0 :(得分:0)

以下解决方案是我对您的其他问题的回答的副本,并且希望能够让您了解如何将其与您当前的解决方案集成。

该脚本读取两个(或更多)CSV文件,并将行条目的交集写入新的CSV文件。我的意思是,如果在input1.csv中的任何位置找到input2.csv中的row1,则该行将被写入输出,依此类推。

import csv

files = ["input1.csv", "input2.csv"]
ldata = []

for file in files:
    with open(file, "r") as f_input:
        csv_input = csv.reader(f_input, delimiter="\t", skipinitialspace=True)
        set_rows = set()
        for row in csv_input:
            set_rows.add(tuple(row))
        ldata.append(set_rows)

with open("Intersection(Brachypodium_Japonica).csv", "wb") as f_output:
    csv_output = csv.writer(f_output, delimiter="\t", skipinitialspace=True)
    csv_output.writerows(set.intersection(*ldata))

您需要添加文件名mangling。这种格式使测试更容易。使用Python 2.7进行测试。