0

すべてが''タグで始まり、' PT J'タグで終わる数百のレコードを含むISIファイルを解析していますER。ネストされたループ内の各レコードからタグ付き情報を取得しようとしていますが、IndexErrorが発生し続けます。なぜ取得したのかはわかりますが、最初の数文字をチェックするよりも、新しいレコードの開始を識別するためのより良い方法はありますか?

    while file:
        while line[1] + line[2] + line[3] + line[4] != 'PT J':
            ...                
            Search through and record data from tags
            ...

私はこれと同じ方法を使用しているため、タグの識別で同じ問題が発生することがあります。そのため、何か提案があれば、よろしくお願いします。

各レコードのすべてのタグが常に含まれているとは限らないサンプルデータは次のとおりです。

    PT J
    AF Bob Smith
    TI Python For Dummies
    DT July 4, 2012
    ER

    PT J
    TI Django for Dummies
    DT 4/14/2012
    ER

    PT J
    AF Jim Brown
    TI StackOverflow
    ER
4

3 に答える 3

3
with open('data1.txt') as f:
    for line in f:
        if line.strip()=='PT J':
            for line in f:
                if line.strip()!='ER' and line.strip():
                    #do something with data
                elif line.strip()=='ER':
                     #this record ends here move to the next record
                     break
于 2012-07-06T03:00:14.397 に答える
2

'ER'行には「ER」のみが含まれていますか?IndexErrorline [4]が存在しないため、sを取得しているのはそのためです。

最初に試すことは次のとおりです。

while not line.startswith('PT J'):

既存のwhileループの代わりに。

また、スライス

line[1] + line[2] + line[3] + line[4] == line[1:5] 

(スライスの終わりは包括的ではありません)

于 2012-07-06T02:51:46.213 に答える
0

このようなアプローチを試して、ファイルを読み通すことができます。

with open('data.txt') as f:
    for line in f:
        line = line.split() # splits your line into a list of character sequences
                            # separated based on whitespace (blanks, tabs)
        llen = len(line)
        if llen == 2 and line[0] == 'PT' and line[1] == 'J': # found start of record
           # process
           # examine line[0] for 'tags', such as "AF", "TI", "DT" and proceed
           # as dictated by your needs. 
           # e.g., 

        if llen > 1 and line[0] == "AF": # grab first/last name in line[1] and line[2]

           # The data will be on the same line and
           # accessible via the correct index values.

        if lline == 1 and line[0] == 'ER': # found end of record.

これには、すべてを正しい順序/順序で配置するために、より多くの「プログラミングロジック」(おそらく埋め込みループ、またはさらに良いのは関数の呼び出し)が必要ですが、基本的な構成があり、開始していくつかのアイデアが得られることを願っています。

于 2012-07-06T02:54:00.977 に答える