【发布时间】:2016-06-29 15:44:30
【问题描述】:
我正在尝试比较两个包含化学品数据的大型 csv 文件。
第一个,“file1”是 14 Mb(不是那么重),但第二个,“file2”是 3Go(47798771 行)。
这里是文件 1 的示例(我们将关注第四列,其中包含 inchikeys):
MFCD00134034 7440-42-8 B UORVGPXVDQYIDP-UHFFFAOYSA-N
MFCD01745487 64719-89-7 B1BBBB(BBBBB1[Li])[Li] XZXJQLAKEUKXOT-UHFFFAOYSA-N
MFCD01310566 19287-45-7 BB QSJRRLWJRLPVID-UHFFFAOYSA-N
MFCD00011323 10035-10-6 Br CPELXLSAUQHCOX-UHFFFAOYSA-N
N(CCNCCCCCCCCCCNCCN(CC)CC)(CC)CC PISAWRHWZGEVPP-UHFFFAOYSA-N
MFCD01744969 137638-86-9 O(C(=O)C(c1ccccc1)c1ccccc1)c1cc2c(C[C@H]3N(CC[C@]2(C)C3C)Cc2ccccc2)cc1 CIRJJEXKLBHURV-MAYWEXTGSA-N
O(CCCN1CCCC1)c1ccc(NC(=Nc2ccccc2)c2ccccc2)cc1 KETUBKLQEXFJBX-UHFFFAOYSA-N
MFCD01694581 3810-31-9 S(CCN(CCSC(N)=N)CCSC(N)=N)C(N)=N GGDUORJVTMUGNU-UHFFFAOYSA-N
MFCD06794992 60066-94-6 Brc1cc(C(=O)c2ncccc2)c(NC(=O)CNC(=O)[C@@H](N)CCCCN)cc1 NVOGGKXDMDDFEG-HNNXBMFYSA-N
MFCD06794980 60066-98-0 Brc1cc(C(=O)c2ncccc2)c(NC(=O)CNC(=O)[C@@H](N)CCCNC(N)=N)cc1 LFCYDGUHINTBOJ-AWEZNQCLSA-N
文件 2:
lat_chemical_id stereo_chemical_id source_cid inchikey
CID100000001 CID000000001 1 RDHQFKQIGNGIED-UHFFFAOYSA-N
CID100000010 CID000000010 10 AUFGTPPARQZWDO-UHFFFAOYSA-N
CID100000100 CID000000100 100 UTIBHEBNILDQKX-UHFFFAOYSA-N
CID100001000 CID000001000 1000 ULSIYEODSMZIPX-UHFFFAOYSA-N
CID100010000 CID000010000 10000 ZPIFKCVYZBVZIV-UHFFFAOYSA-N
CID100100000 CID000100000 100000 SPTBIJLJJBZGDY-UHFFFAOYSA-N
CID101000000 CID001000000 1000000 XTNVYACQOFUTNH-UHFFFAOYSA-N
CID110000000 CID010000000 10000000 WUGPGGSZFRVGGA-UHFFFAOYSA-N
CID110000001 CID010000001 10000001 ANOUMYXLUIDQNL-UHFFFAOYSA-N
我的目标是比较两个文件中第四行的 inchikeys,看看它们是否相同。然后在这种情况下,提取所有信息(从两个文件中)并将它们写入第三个。
这是我的(天真的)代码:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
######################
import numpy as np
import argparse
import csv
#################################
def compare(tab_data_inchik,stitch,output):
dt = open(tab_data_inchik, 'rb')
st = open(stitch,'rb')
out = open(output,'wb')
data = csv.reader(dt, delimiter = '\t')
database = csv.reader(st, delimiter = '\t')
result = csv.writer(out, delimiter = '\t')
for line in data:
for row in database:
if line[3] == row[3]:
result.writerow((line[0],line[1],line[2],row[0],row[1],row[2],row[3]))
dt.close()
st.close()
out.close()
##############################""
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("tsv1", help = "Pr Data")
parser.add_argument("tsv2", help = "Database")
parser.add_argument("output", help = "output file")
args=parser.parse_args()
compare(args.tsv1,args.tsv2,args.output)
看来,程序甚至没有到达数据库循环的第二行,我猜是因为文件太大而且我的方法是机器人优化的。也许我应该使用 numpy.where() 但我不知道如何使用。
有没有办法在没有双循环的情况下获取信息? 提前致谢。
【问题讨论】:
-
没有尝试我的新代码??我敢打赌它会运行不到 10 分钟。
-
刚刚尝试过(我在法国)。奇迹般有效。非常感谢
-
欢迎您,完成需要多长时间?如果你能提供一个基准,那就太好了。
-
花了9分钟,我错了,较小的是147 000
-
另一种方法要运行一天以上。