0

昨日Pythonスクリプトの学習を始めたばかりで、すでに行き詰まっています。:(

そのため、さまざまな分野のさまざまな情報を含むデータ ファイルがあります。

基本的に次のようにフォーマットされています...

名前 (タブ)開始番号 (タブ) 終了番号 (タブ) 必要なフィールドの束 繰り返しで何もしない

開始番号と終了番号を受け取るスクリプトを作成し、別のフィールドが + または - であるかどうかに応じて、それに応じて数値を加算/減算する必要があります。

単語を次のようなものに置き換えることができることを知っています。

x = open("infile")
y = open("outfile","a")
while 1:
  line = f.readline()
  if not line: break
  line = line.replace("blah","blahblahblah")
  y.write(line + "\n")
y.close()

しかし、私はあらゆる種類のさまざまな場所を見てきましたが、各行から特定のフィールドを抽出し、1 つのフィールドを読み取り、他のフィールドを変更する方法がわかりません。行を配列に読み込むことができると読みましたが、その方法を見つけることができないようです。

どんな助けでも素晴らしいでしょう!

編集:

データの行の例: (それぞれ|がタブ文字を表します)

            |          |
            V          V
chr21 | 33025905 | 33031813 | ENST00000449339.1 | 0 | **-** | 33031813 | 33031813 | 0 | 3 | 1835,294,104, | 0,4341,5804,
chr21 | 33036618 | 33036795 | ENST00000458922.1 | 0 | **+** | 33036795 | 33036795 | 0 | 1 | 177,          | 0,

2 列目と 3 列目 (矢印で示されている) は、読み取り/変更が必要な列です。

4

1 に答える 1

2

分割を行うために使用できますcsvが、この種の問題の場合、私は通常、次を使用しますstr.split

with open(infile) as fin,open('outfile','w') as fout:
   for line in fin:
       #use line.split('\t'3) if the name of the field can contain spaces
       name,start,end,rest = line.split(None,3)  
       #do something to change start and end here.
       #Note that `start` and `end` are strings, but they can easily be changed
       #using `int` or `float` builtins.
       fout.write('\t'.join((name,start,end,rest)))

csvこのように行を分割したい場合は便利です:

this is a "single argument"

の中へ:

['this','is','a','single argument']

しかし、ここではそれが必要ではないようです。

于 2012-09-21T19:05:08.183 に答える