0

私は物理学者で、プログラミングの問題について助けが必要です! 多くのイベントを含む一連のデータがあり、イベントごとに関数が呼び出されます。このようなものです

for event in range(100000):
    ProcessRegion(region, event)

これらのイベントは、 と呼ばれる検出器の特定の領域で発生しますcells。各セルには 2 つのチャネルがありpartitionmodule数字とchannel. 4 つのパーティション (LBA、LBC、EBA、EBC)、64 のモジュール、47 のチャネルがあります。使用する必要がある追加データを含む 3 つの長いファイルがあります。これらは次のようにフォーマットされています。

EBC64 41 1    1.012327
EBC64 42 0    1.000000
EBC64 42 1    1.000000
EBC64 43 0    1.000000
EBC64 43 1    1.000000
EBC64 44 0    1.000000
EBC64 44 1    1.000000
EBC64 45 0    1.000000
EBC64 45 1    1.000000
EBC64 46 0    1.000000
EBC64 46 1    1.000000
EBC64 47 0    1.000000
EBC64 47 1    1.000000

パーティションとモジュール (EBC64 など)、スペース、チャネル番号、および最後の列に使用したいデータが表示されるようにします。私はこのような3つのファイルから読みたいと思っています.私の質問は次のような方法を使用しています

def ProcessRegion(region, event):

    partition = region.get_partiotion()
    module    = region.get_module()
    channel   = region.get_channel()

データを抽出して分析に使用できるように、これら 3 つのファイルのそれぞれで正確な行を取得するにはどうすればよいでしょうか?

編集:

あいまいな質問で申し訳ありませんが、私はそれをよりよく説明しようとします。

3 つのファイルのそれぞれで、それに対応するデータを見つけたいパーティション モジュールとチャネルがあります。たとえば、1 つのイベントについて、パーティション = EBC、モジュール = 64、チャネル = 41 があります。データを取得するための 3 つの異なるファイル。この場合、上記のリストから、1.012327 になります。これで少し明確になることを願っています。そうでない場合は、もう一度書き直すことができます。

4

4 に答える 4

1

基本的なファイルと解析操作について質問しているように聞こえます。私は次のようなことをします

f = open("file.txt")
for line in f:
    event = [x for x in line.split(' ') if x]
    partition = event[0][:3]
    module = int(event[0][3:])
    channel = int(event[1])

詳細に

f = open("file.txt")

file.txt がファイル名であるファイルを開きます。

for line in f:

ファイル内のすべての入力行をループします。各イベントは 1 行にあるため、各イベントは 1 行のテキストになります。

event = filter(None, line.split(' '))

行を空白で分割し、空の文字列をすべて削除します。

partition = event[0][:3]

パーティションとなる最初のチャンク (スペースの前のテキストの最初のブロック) の最初の 3 文字を読み取ります。

module = int(event[0][3:])

4 番目の文字から最初のチャンクの最後までを読み取り、数値として解釈します。

channel = int(event[1])

2 番目のチャンク全体を読み取り、数値として解釈します。

残りのデータは (例では単一の 1 または 0) event[2] および event[3] (浮動小数点数) になります。

于 2013-09-06T09:14:34.240 に答える
0

次のようなことを試してください:

from __future__ import division

fin = open('data.txt')
data = fin.readlines()
fin.close()

for row in data:
    partition,module,channel,value = row.split()
    value = float(value)
    print partition,module,channel,'value:',value

アウト:

EBC64 41 1 value: 1.012327
EBC64 42 0 value: 1.0
EBC64 42 1 value: 1.0
EBC64 43 0 value: 1.0
EBC64 43 1 value: 1.0
EBC64 44 0 value: 1.0
EBC64 44 1 value: 1.0
EBC64 45 0 value: 1.0
EBC64 45 1 value: 1.0
EBC64 46 0 value: 1.0
EBC64 46 1 value: 1.0
EBC64 47 0 value: 1.0
EBC64 47 1 value: 1.0
于 2013-09-06T09:06:52.537 に答える