0

以下のような 2 つの fastq ファイルがあります。ファイル内の各レコードは「@」で始まります。そのような 2 つのファイルについて、私の目的は、2 つのファイルに共通するレコードを抽出することです。

@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)

ここでは、メイン ファイルで共通 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)

より大きなファイル(ファイルあたり 4000 万から 1 億レコード、各レコードは 4 行)で動作するように、上記のコードをどうすればよいか提案してください。

4

1 に答える 1

0

リスト内包表記を使用すると、次のように記述できます。

list1 = [i for item in data1 if '@' in item]
list2 = [i for item in data2 if '@' in item]

セット内包表記を使用して直接セットとして定義することもできます (使用しているpython のバージョンによって異なります)

set1 = {i for item in data1 if '@' in item}
set2 = {i for item in data2 if '@' in item}

リストを作成してからセットを作成するよりも、最初からセットを作成する方が速いと思います。

コードの 2 番目の部分については、何を達成しようとしているのかまだよくわかりません。

于 2013-06-18T17:45:58.150 に答える