1

遺伝子情報のスプレッドシートを作成するこのcsv ファイルをダウンロードしました。重要なのは、HLA-*列に遺伝子情報があることです。遺伝子の分解能が低すぎる場合、たとえばDQB1*03行を削除する必要があります。たとえば、データの解像度が高すぎる場合は、末尾DQB1*03:02:01:01タグを削除する必要があります。DQB1*03:02したがって、理想的には、タンパク質を の形式にして、 の後に 2 つのレベルの解像度を持たせたいと考えていますDQB1*。これらの形式を探して、それらに保存されているデータを無視するようにPythonに指示するにはどうすればよいですか。例えば

if (csvCell is of format DQB1*03:02:01):
   delete the :01 # but do this in a general format
elif (csvCell is of format DQB1*03):
   delete row
else:
   goto next line

更新:私が参照した編集済みコード

import csv
import re
import sys

csvdictreader = csv.DictReader(open('mhc.csv','r+b'), delimiter=',')
csvdictwriter = csv.DictWriter(file('mhc_fixed.csv','r+b'), fieldnames=csvdictreader.fieldnames, delimiter=',')
csvdictwriter.writeheader()
targets = [name for name in csvdictreader.fieldnames if name.startswith('HLA-D')]

for rowfields in csvdictreader:
  keep = True
  for field in targets:
    value = rowfields[field]
    if re.match(r'^\w+\*\d\d$', value):
      keep = False
      break # quit processing target fields
    elif re.match(r'^(\w+)\*(\d+):(\d+):(\d+):(\d+)$', value):
      rowfields[field] = re.sub(r'^(\w+)\*(\d+):(\d+):(\d+):(\d+)$',r'\1*\2:\3', value)
    else: # reduce gene resolution if too high
              # by only keeping first two alles if three are present
      rowfields[field] = re.sub(r'^(\w+)\*(\d+):(\d+):(\d+)$',r'\1*\2:\3', value)
  if keep:
     csvdictwriter.writerow(rowfields)
4

2 に答える 2

2

これは非常に単純なフィルターです。

import sys

for line in sys.stdin:
  line = line.replace( ',DQB1*03:02:01,', ',DQB1*03:02,' )

  if line.find( ',DQB1*03,' ) == -1:
    sys.stdout.write( line )

または、正規表現を使用する場合

import re
import sys

for line in sys.stdin:
  line = re.sub( ',DQB1\\*03:02:01,', ',DQB1*03:02,', line )
  if re.search( ',DQB1\\*03,', line ) == None:
    sys.stdout.write( line )

次のように実行します

python script.py < data.csv
于 2012-12-04T23:47:16.557 に答える
2

ここにあなたが望むことをするだろうと私が思うものがあります。csvPython のモジュールを使用してファイルを処理するため、Peter の回答ほど単純ではありません。彼のようにファイルをプレーンテキストとして扱うように書き直して単純化することもできますが、それは簡単なはずです。

import csv
import re
import sys

csvdictreader = csv.DictReader(sys.stdin, delimiter=',')
csvdictwriter = csv.DictWriter(sys.stdout, fieldnames=csvdictreader.fieldnames, delimiter=',')
csvdictwriter.writeheader()
targets = [name for name in csvdictreader.fieldnames if name.startswith('HLA-')]

for rowfields in csvdictreader:
    keep = True
    for field in targets:
        value = rowfields[field]
        if re.match(r'^DQB1\*\d\d$', value): # gene resolution too low?
            keep = False
            break # quit processing target fields
        else: # reduce gene resolution if too high
              # by only keeping first two alles if three are present
            rowfields[field] = re.sub(r'^DQB1\*(\d\d):(\d\d):(\d\d)$',
                                      r'DQB1*\1:\2', value)
    if keep:
        csvdictwriter.writerow(rowfields)

私にとって最も難しかったのは、あなたが何をしたいのかを決めることでした。

于 2012-12-05T05:22:14.760 に答える