2017-09-25 18 views
0

私のコードでは、ファイルをループしてファイル内のパターンをカウントします。python;出力をテキストファイルに書き込む方法

from collections import defaultdict 
import csv, os, re 
from itertools import groupby 
import glob 


    def count_kmers(read, k): 
     counts = defaultdict(list) 
     num_kmers = len(read) - k + 1 
     for i in range(num_kmers): 
      kmer = read[i:i+k] 
      if kmer not in counts: 
       counts[kmer] = 0 
      counts[kmer] += 1 
     for item in counts: 
      return(basename, sequence, item, counts[item]) 

    for fasta_file in glob.glob('*.fasta'): 
     basename = os.path.splitext(os.path.basename(fasta_file))[0] 
     with open(fasta_file) as f_fasta: 
      for k, g in groupby(f_fasta, lambda x: x.startswith('>')): 
       if k: 
        sequence = next(g).strip('>\n') 
       else: 
        d1 = list(''.join(line.strip() for line in g)) 
        d2 = ''.join(d1) 
        complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} 
        reverse_complement = "".join(complement.get(base, base) for base in reversed(d1)) 
        d3 = list(''.join(line.strip() for line in reverse_complement)) 
        d4 = ''.join(d3) 
        d5 = (d2+d4) 
        counting = count_kmers(d5, 5) 
        with open('kmer.out', 'a') as text_file: 
         text_file.write(counting) 

を次のように私のコードであり、私の出力は、この

1035 1 GAGGA 2 
1035 1 CGCAT 1 
1035 1 TCCCG 1 
1035 1 CTCAT 2 
1035 1 CCTGG 2 
1035 1 GTCCA 1 
1035 1 CATGG 1 
1035 1 TAGCC 2 
1035 1 GCTGC 7 
1035 1 TGCAT 1 

コードが正常に動作しますが、私は、ファイルへの私の出力を書き込むことができないように見えます。私は次のエラーを取得:

TypeError         Traceback (most recent call last) 
<ipython-input-190-89e3487da562> in <module>() 
    37     counting = count_kmers(d5, 5) 
    38     with open('kmer.out', 'w') as text_file: 
---> 39      text_file.write(counting) 

TypeError: write() argument must be str, not tuple 

私が間違っているのは何を、どのように私は私のコードは、txtファイルに出力を書き込むことを確認するために、この問題を解決することができますか?

+1

あなたは関数から何も返さず、画面に印刷するだけです。明示的な 'return'文がなければ、Python関数は' counting = count_kmers(d5、5) 'が行う' None'を返し、 '''" .join(None) 'しようとすると'そのエラー –

+0

私のコードを変更しましたが(printの代わりにreturnを使用しました)、書き込み引数がstrで、タプルではないというエラーが表示されますか? – Gravel

+0

デバッグするのにかなり簡単なエラーのようです... –

答えて

5

count_kmers()の元のバージョンにはreturnという文が含まれていませんでした。つまり、暗黙のうちにreturn Noneが含まれています。

これをcountingに割り当てると、すべてのエラーが自明になりました。

あなたの編集後は、関数の最後には、このように見えた:4つの値でタプルを返し

for item in counts: 
    return(basename, sequence, item, counts[item]) 

。また、ループを通る最初のパスで関数を終了します。

+0

私のコードを変更しました(printの代わりにreturnを使用します)、write引数がstrで、タプルではないというエラーが返されますか? – Gravel

+0

これで、 'tuple'を返すので、ループの最初のパスで終了します – kdopen

関連する問題