0

次のような入力ファイルがあります。

#nP 4
#mP 0.0262
#mH     10
#HP various info:
14  H   0.026
19  P   0.054
20  H   0.012
512 H   0.005
#xP
#kP
99
89
90

5 行目から 4 行 (最初の行で np = 4 であるため) を抽出したいので、出力は次のようになります。

14  H   0.026
19  P   0.054
20  H   0.012
512 H   0.005

私はこれを試しました:

import sys

head = sys.stdin.readline()
head = head.strip()
head = head.split('\t')
cntHetPos = int(head[1])
if "#HP" in sys.stdin.readlines():
  lines = sys.stdin.readlines()[0:cntHetPos]
  print lines

ただし、行は出力されず、エラーメッセージも表示されません。これは、ここで見つけた以前の回答に基づいています: Read file from line 2 or skip header row Ideas?

4

4 に答える 4

2

readlines()最初に呼び出したときはすべての行のリストを返しますが、2 回目はすべての行が既に読み取られて消費されているため空です。それらを変数に格納します。

lines = sys.stdin.readlines()

headそれを使用して変数を読み取ることもできるため、それを一番上に置きます。

head = lines[0]

もう1つの問題は、トークンを見つけるためにすべての行をループする必要が#HPあり、リストを正しくスライスできるように行番号を追跡する必要があることです:

for i, line in enumerate(lines):
  if "#HP" in line:
    lines = lines[i+1 : i+1+cntHetPos]

最後に、フォーマットされたリストではなく行を印刷したい場合は、行を結合する必要があります (行末文字が既にそこにあることに注意してください)。

    print ''.join(lines),

そして、おまけに、正しい行を見つけたらすぐに停止できるのでbreakprint.

総括する:

import sys

lines = sys.stdin.readlines()
head = lines[0]
head = head.strip()
head = head.split('\t')
cntHetPos = int(head[1])
for i, line in enumerate(lines):
  if "#HP" in line:
    lines = lines[i+1 : i+1+cntHetPos]
    print ''.join(lines),
    break
于 2013-04-08T11:03:57.360 に答える
0

linecache モジュールは、ファイルから効率的に行を読み取るように調整されています。

linecache モジュールを使用すると、キャッシュを使用して内部的に最適化を試みながら、任意のファイルから任意の行を取得できます。これは、単一のファイルから多くの行が読み取られる一般的なケースです。これは、フォーマットされたトレースバックに含めるソース行を取得するために、トレースバック モジュールによって使用されます。

テキスト ファイルの名前blahが で、ファイル データが 5 行目から始まるとします。

#!/usr/bin/python   

import linecache

starting_line_number = 5   
number_of_lines      = int(linecache.getline('blah',1).split()[1])
for line_num in range(starting_line_number, starting_line_number+number_of_lines):
    print linecache.getline('blah',line_num),
于 2013-04-08T11:33:03.613 に答える