我想比較兩個包含化學數據的大型csv文件。比較兩個大的csv文件,並用python編寫另一個文件
第一個,「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[[email protected]]3N(CC[[email protected]]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)[[email protected]@H](N)CCCCN)cc1 NVOGGKXDMDDFEG-HNNXBMFYSA-N
MFCD06794980 60066-98-0 Brc1cc(C(=O)c2ncccc2)c(NC(=O)CNC(=O)[[email protected]@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分鐘內運行。 – FazeL
剛剛嘗試過(我在法國)。奇蹟般有效。非常感謝 –
您的歡迎,完成需要多長時間?如果你可以提供一個基準,它會是膨脹的。 – FazeL