大型csv文件的交集

2024-09-28 20:52:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个包含数千个条目的大型csv文件,每个文件包含两列表单ID:

BRADI5G01462.1_1    NCRNA_34654_1853
BRADI5G01462.1_1    NCRNA_34398_1942
BRADI5G01462.1_1    NCRNA_2871_1959

我试过了,但它没有给出预期的结果

^{pr2}$

找到两个文件的交集最有效的python方法是什么?!即两个文件中两列的全部匹配。在

我问过这个问题,但没有人愿意帮忙。在

我真的被困在这件事上,急需帮助,我将不胜感激。在

编辑:
文件1(左)输入示例:

BRADI5G16060.1_36   OS08T0547100-02_5715
BRADI3G00440.1_243  OS03T0274400-01_2650
BRADI3G58610.1_438  OS01T0112500-01_899
BRADI1G73670.1_850  OS11T0481500-01_6621
BRADI1G78150.1_870  OS02T0543300-00_2055

文件2(右)输入示例:

BRADI5G16060.1_36   OS08T0547100-02_5715
BRADI4G45180.1_240  OS03T0103800-01_2473
BRADI2G12470.2_487  OS04T0470600-00_3504
BRADI1G73670.1_850  OS11T0481500-01_6621
BRADI1G78330.1_878  OS06T0155600-01_4411

左右交叉文件:

BRADI5G16060.1_36   OS08T0547100-02_5715
BRADI1G73670.1_850  OS11T0481500-01_6621

Tags: 文件csv方法目的id编辑表单示例
3条回答

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

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。这种格式使测试更容易。使用Python2.7进行了测试。在

当我查看你的代码时,它是这样的

->您有两个文件

->;将它们重新写入两个文件

->最后将它们添加到交叉点文件中

让我们去掉第二步

import csv
files=["#Left(Brachypodium_Japonica).csv","#Right(Brachypodium_Japonica).csv"]
for i in files:
    with open(i,"r",newline='') as source:
        rdr= csv.reader( source,delimiter="\t",skipinitialspace=True )
        with open('Intersection(Brachypodium_Japonica).csv',"aw",newline='') as result:
            wtr= csv.writer( result,delimiter="\t",skipinitialspace=True )
            for r in rdr:
                wtr.writerow( (r[0],r[1]) )

步骤:

->读取第一个文件并将其添加到交叉点

->读取下一个文件并继续追加

try this and if does not work then do let me know. I have no idea why did u use that newline and skip but if you know why, then u may continue with it. i have rewritten the code in a proper way following your format.

我在我的系统上试过了,如果它不起作用,请指出回溯或错误。在

这里我做了一些假设,如果错误的话,代码会更复杂:

  • 索引将是您所说的数据集之间相似的“两个”字段(在我的示例中,用于索引的字段是第一行的两个字段)
  • “索引在数据集中出现次数不超过一次”左.csv不超过一次右.csv)在
  • 你想最小化内存使用
  • 字段中不存在分隔符(\t

import mmap

indexes = {}

left_fp = open('left.csv', 'r')
left = mmap.mmap(left_fp.fileno(), 0, access=mmap.ACCESS_READ)

while True:
        start = left.tell()
        line = left.readline()
        if not line: break
        # extract only the two columns you check
        cells = line.split('\t')[0:2]
        # store line position in left file
        indexes['\t'.join(cells)] = (start, left.tell() - start)


output = open('output.csv', 'w')

for line in open('right.csv'):
        # recreate the key
        cells = line.split('\t')[0:2]
        pos = left_indexes[key]
        if pos:
                # got the left line position
                left.seek(pos[0], 0)
                # write it
                output.write(left.read(pos[1]))
                # write right row
                output.write(line)

output.close()

相关问题 更多 >