0

Python を使用して、時間とタイトルを含むテキスト ファイル (var trackList に格納されている) を解析しようとしています。

00:04:45 example text
00:08:53 more example text
12:59:59 the last bit of example text

私の正規表現(rem)は機能します。文字列(i)を2つの部分に正しく分割することもできます(時間とテキストを分離するように)が、分割が返す配列を(.extendを使用して)追加することはできません以前に作成した大きな配列 (sLines) に。

f=open(trackList)
count=0
sLines=[[0 for x in range(0)] for y in range(34)]   
line=[]

for i in f:
    count+=1
    line.append(i)
    rem=re.match("\A\d\d\:\d\d\:\d\d\W",line[count-1])
    if rem:
        sLines[count-1].extend(line[count-1].split(' ',1))
    else:
        print("error on line: "+count)

そのコードは、ファイル trackList の各行を通過し、その行が期待どおりかどうかをテストし、そうである場合は時間をテキストから分離し、その結果を配列として保存し、その結果を配列内の配列として保存します。現在の行番号、そうでない場合はエラーを表示してその行を示します

array[count-1]Python配列はゼロインデックスであり、ファイル行はゼロではないため、私は使用します。

.extend()親 for ループの同じ反復で、小さい方の配列の両方の要素を大きい方の配列に追加するために使用します。

4

1 に答える 1

1

そのため、かなり紛らわしいコードがいくつかあります。

たとえば、次のようにします。

[0 for x in range(0)]

空のリストを初期化するための本当に素晴らしい方法です:

>>> [] == [0 for x in range(0)]
True

また、34 行の長さの行列を取得するにはどうすればよいでしょうか? また、forループで行「i」を呼び出すことで混乱しています。通常、これはインデックスの省略形の構文として予約されており、数値であると予想されます。i を行に追加してから、それを line[count-1] として再参照することは、行変数 (i) が既にある場合は冗長です。

全体的なコードは次のように簡略化できます。

# load the file and extract the lines
f = open(trackList)
lines = f.readlines()
f.close()

# create the expression (more optimized for loops)
expr   = re.compile('^(\d\d:\d\d:\d\d)\s*(.*)$')
sLines = []

# loop the lines collecting both the index (i) and the line (line)
for i, line in enumerate(lines):
    result = expr.match(line)

    # validate the line
    if ( not result ):
        print("error on line: " + str(i+1))
        # add an invalid list to the matrix
        sLines.append([])  # or whatever you want as your invalid line
        continue

    # add the list to the matrix
    sLines.append(result.groups())
于 2012-09-05T18:00:06.170 に答える