我有两个csv文件:一个是98 MB,另一个是152 kb。较小的文件是较大的文件的随机子集,我想从大csv写第三个文件,使得行对应于较小的csv文件中的每一行。
大文件(摘录):
ZINC_ID MWT LogP Desolv_apolar Desolv_polar HBD HBA tPSA Charge NRB SMILES
ZINC00000017 281.337 1.33 3.07 -19.2 2 6 87 0 4 CCC[S@](=O)c1ccc2c(c1)[nH]/c(=N/C(=O)OC)/[nH]2
ZINC00000036 151.141 0.37 3.51 -45.3 1 3 60 -1 2 c1ccc(cc1)[C@@H](C(=O)[O-])O
ZINC00000048 222.24 2.42 3.78 -8.68 0 4 37 0 4 COc1cc(c(c2c1OCO2)OC)CC=C
ZINC00000053 179.151 1.43 6.59 -56.84 0 4 66 -1 3 CC(=O)Oc1ccccc1C(=O)[O-]
小文件(摘录):
SMILES
CCOc1ccc(cc1)NC(=O)C[C@@H](C)O
C[C@@H](c1ccc2c(c1)nc(o2)c3ccc(cc3)Cl)C(=O)[O-]
CC(=O)Oc1ccccc1C(=O)[O-]
COc1cc(c(c2c1OCO2)OC)CC=C
这是我的代码:
import csv
writer = csv.writer(open('/Users/Eric/Desktop/newZincSubset.csv','wb'))
count = 0
with open('/Users/Eric/Desktop/test700.csv','rU') as i:
with open('/Users/Eric/Desktop/initial_data.csv','rU') as j:
subject = csv.reader(i)
reference = csv.reader(j)
for row in subject:
smiles = row[0]
for reference_row in reference:
suspect = reference_row[10]
if (smiles == suspect):
writer.writerow(reference_row)
似乎写好标题(ZINC_ID MWT LogP)就好了,但是停止搜索每一行。这是内存问题还是我的代码有问题?
谢谢!
答案 0 :(得分:2)
CSV阅读器只需迭代一次。第一次内部迭代完成后,底层文件对象到达文件末尾。一旦你尝试第二次迭代reference
读者,就没有什么可读的了。
我建议您先将小文件读入字典,然后在较大的文件上迭代,搜索与内存中数据的匹配项。您还可以通过最终查找的内容来键入字典中的元素(我认为参考[10]),因此不需要嵌套循环。
答案 1 :(得分:2)
使用DictReader
和DictWriter
来实现标头的实现:
import csv
with open('sample.csv','rU') as i:
smiles = set(x['SMILES'] for x in csv.DictReader(i))
with open('init.csv','rU') as j:
reference = csv.DictReader(j, delimiter = '\t')
fields = reference.fieldnames
writer = csv.DictWriter(open('newZincSubset.csv','wb'),
fields,
delimiter = '\t')
writer.writerow(dict((x,x) for x in fields))
for reference_row in reference:
if reference_row['SMILES'] in smiles:
writer.writerow(reference_row)