我有两个fastq文件,如下面给出的那个。文件中的每条记录都以“@”开头。对于两个这样的文件,我的目的是提取两个文件常见的记录。
@IRIS:7:1:17:394#0/1
GTCAGGACAAGAAAGACAANTCCAATTNACATTATG
+IRIS:7:1:17:394#0/1
aaabaa`]baaaaa_aab]D^^`b`aYDW]abaa`^
@IRIS:7:1:17:800#0/1
GGAAACACTACTTAGGCTTATAAGATCNGGTTGCGG
+IRIS:7:1:17:800#0/1
ababbaaabaaaaa`]`ba`]`aaaaYD\\_a``XT
我试过这个: 首先,我得到一个在file1和2中常见的读取ID列表。
import sys
#('reading files and storing all lines in a list')
data1 = open(sys.argv[1]).read().splitlines()
data2 = open(sys.argv[2]).read().splitlines()
#('listing all read IDs from file1')
list1 = []
for item in data1:
if '@' in item:
list1.append(item)
#('listing all read IDs from file2')
list2 = []
for item in data2:
if '@' in item:
list2.append(item)
#('finding common reads in file1 and file2')
def intersect(a, b):
return list(set(a) & set(b))
common = intersect(list1, list2)
在这里,我在主文件中搜索commom ID并将数据导出到新文件中。以下代码适用于小文件,但如果我尝试使用较大的文件冻结我的电脑。我相信'for'占据了太多的记忆:
#('filtering read data from file1')
mod_data1 = open(sys.argv[1]).read().rstrip('\n').replace('@', ',@')
tab1 = open(sys.argv[1] + '_final', 'wt')
records1 = mod_data1.split(',')
for item in records1[1:]:
if item.replace('\n', '\t').split('\t')[0] in common:
tab1.write(item)
请建议我应该如何处理上面的代码,以便它适用于较大的文件(40-100万条记录/文件,每条记录为4行)。
答案 0 :(得分:0)
使用列表理解,你可以写:
list1 = [i for item in data1 if '@' in item]
list2 = [i for item in data2 if '@' in item]
你也可以使用set comprehension直接将它们定义为集合(取决于version of python you are using)。
set1 = {i for item in data1 if '@' in item}
set2 = {i for item in data2 if '@' in item}
我希望从头开始创建集合比创建列表更快,然后创建一个集合。
至于代码的第二部分,我还不太清楚你想要实现的目标。