0

Python を使用して、次のような形式のテキスト ファイルからデータを解析しようとしています。

<event>  
A   0.8
B    0.4  0.3 -0.5  0.3
</event>
<event>  
A   0.2
B    0.3  0.2 -0.5  0.8
C    0.1  0.3 -0.3  0.2
C   -0.2  0.4 -0.1  0.9
</event>
<event>  
A   0.4
B    0.4  0.3 -0.5  0.3
C    0.3  0.7  0.6  0.5
</event>

変数 A と B は常に各イベントに存在しますが、ご覧のとおり、C 変数は 1 つのイベントで最大 2 回発生する可能性があり、まったく発生しない場合もあります。全部で約10,000以上のイベントがあります。

このすべてをフォーマットして、各データを個別に呼び出すことができるようにしたいと思います (つまり、イベント 3 の変数 B の列 2) だけでなく、グループ (つまり、すべてのイベントの変数 A、列 0 をプロットする) でも、 C変数を繰り返すと、少しつまずきます。理想的には、C 変数 #1 と C 変数 #2 のデータの列が必要です。イベントに C 変数が 1 つまたは 0 つしかない場合、データは単純に 0 になります。

私のコードは現時点ではエレガントとはほど遠いものであり、出力形式は必要なものとはまったく異なります.

M = 10000        # number of events 
file = open('data.txt')
a_lines = open('a.txt','w')
b_lines = open('b.txt','w')
c1_lines = open('c1.txt','w')
c2_lines = open('c2.txt','w') 
c1 = []
c2 = []

for i in range(M):
    for line in file: 
        if not line.strip():
            continue  
        if line.startswith("</event>"):
            break 
        elif line.startswith("<event>"):
            a = file.next()
            print >>a_lines,i,a

for i in range(M):
    for line in file: 
        if line.startswith("B"):
            print >>b_lines,i,line.strip()
            nextline=file.next().strip()
            c1.append(nextline)
            nextline2=file.next().strip()
            c2.append(nextline2)
            break

# Parsing the duplicate C columns...
# I've formatted it so the 0 is aligned with the other data

for i in range(M):
    if "C" in c1[i]:
        print >>c1_lines, i, c1[i]
    else: 
        print >>c1_lines, i, "C    0" 


for i in range(M):
    if "C" in c2[i]:
        print >>c2_lines, i, c2[i]
    else: 
        print >>c2_lines, i, "C    0"

#  Sample variable formatting attempt: 

b_event_num,b_0,b_1,b_2,b_3=loadtxt("b.txt",usecols=(0,1,2,3,4),unpack=True)
b_0=array(b_0)
b_1=array(b_1)
b_2=array(b_2)
b_3=array(b_3)
b_0=b_0.reshape((len(b_0)),1)
b_1=b_1.reshape((len(b_1)),1)
b_2=b_2.reshape((len(b_2)),1)
b_3=b_3.reshape((len(b_3)),1)
b_points=np.hstack((b_0,b_1,b_2,b_3))

抽出されたデータ自体は問題ないように見えますが、列に読み込もうとすると、次のエラーが発生します。理由はわかりません。

vals = [vals[i] for i in usecols]
IndexError: list index out of range

助けていただければ幸いです。ありがとう!

4

1 に答える 1

0

IndexError は、vals = [] のときに vals[0] にアクセスしようとすると発生します。コードを展開すると、エラーがより意味のあるものになる可能性があります。

vals = []
for i in usecols:
    vals[i] = i

vals[0] がリストにないため、ループの最初の使用でエラーが発生します。修正を提案しますが、何をしようとしているのかわかりません。vals をリスト [0,1,2,3,4] にしたい場合は、単に使用できます

vals = range(5)

編集:ちなみに、別のファイルに保存する必要はないと思います。次のように、配列に直接保存する方がはるかに優れています。

M = 10000        # number of events 
file = open('data.txt')
a = []
b = []
c2 = []
c2 = []

def parseLine(line, section):
    line = line.split()
    line = line[1:]  # To take out the letter at the start
    section.append(line)

file.next()
for i in range(M):
    parseLine(file.next(), a)
    parseLine(file.next(), b)
    nextLine = file.next()
    if nextLine.startswith("C"):
        parseLine(nextLine, c1)
        nextLine = file.next()
        if nextLine.startswith("C"):
            parseLine(nextLine, c2)
            file.next()    # To get to the end of the event
        else:
            c2.append([0])
    else:
        c1.append([0])
        c2.append([0])
    file.next()

ただし、b の 8 番目のイベントの 2 番目の要素から要素を取得するには、b[7][1] を実行するため、b[event-1][column-1] になるので注意してください。

于 2012-07-23T18:25:09.413 に答える