我有15个.csv
个文件,格式如下:
**File 1**
MYC
RASSF1
DAPK1
MDM2
TP53
E2F1
...
**File 2**
K06227
C00187
GLI1
PTCH1
BMP2
TP53
...
我想创建一个循环,遍历15个文件中的每一个,每次比较2个,创建唯一的对。因此,File 1
和File 2
会相互比较,给出一个输出,告诉我它找到了多少匹配以及它们是什么。所以在上面的例子中,输出将是:
1 match and TP53
循环将用于相互比较所有文件,因此1,3
(File 1
针对File 3
),1,4
等等。
f1 = set(open(str(cancers[1]) + '.csv', 'r'))
f2 = set(open(str(cancers[2]) + '.csv', 'r'))
f3 = open(str(cancers[1]) + '_vs_' + str(cancers[2]) + '.txt', 'wb').writelines(f1 & f2)
上述工作,但我很难创建循环部分。
答案 0 :(得分:1)
要遍历所有15对,这样的事情可以做到:
for i in range(1, 15):
for j in range(i+1, 16):
f1 = set(open(str(cancers[i]) + '.csv', 'r'))
f2 = set(open(str(cancers[j]) + '.csv', 'r'))
f3 = open(str(cancers[i]) + '_vs_' + str(cancers[j]) + '.txt',
'wb').writelines(f1 & f2)
答案 1 :(得分:1)
为了不比较同一个文件,并使代码对癌症的数量灵活,我会像这样编码。我假设cancer
是一个列表。
# example list of cancers
cancers = ['BRCA', 'BLCA', 'HNSC']
fout = open('match.csv', 'w')
for i in range(len(cancers)):
for j in range(len(cancers)):
if j > i:
# if there are string elements in cancers,
# then it doesn't need 'str(cancers[i])'
f1 = [x.strip() for x in set(open(cancers[i] + '.csv', 'r'))]
f2 = [x.strip() for x in set(open(cancers[j] + '.csv', 'r'))]
match = list(set(f1) & set(f2))
# I use ; to separate matched genes to make excel able to read
fout.write('{}_vs_{},{} matches,{}\n'.format(
cancers[i], cancers[j], len(match), ';'.join(match)))
fout.close()
结果
BRCA_vs_BLCA,1 matches,TP53
BRCA_vs_HNSC,6 matches,TP53;BMP2;GLI1;C00187;PTCH1;K06227
BLCA_vs_HNSC,1 matches,TP53