次のようなデータを含むファイルがあります。
# 0 867.691994 855.172889 279.230411 -78.951239 55.994189 -164.824148
# 0 872.477810 854.828159 279.690170 -78.950558 55.994391 -164.823700
...
893.270609 1092.179289 184.692319
907.682255 1048.809187 112.538457
...
# 0 877.347791 854.481104 280.214892 -78.949869 55.994596 -164.823240
...
893.243290 1091.395104 184.726720
907.682255 1048.809187 112.538457
...
# 0 882.216053 854.135168 280.745489 -78.948443 55.996206 -164.821887
そして、次の方法でコメント行の間の行のみを読み取りたいと思います。2つの隣接するコメントの間のすべての行を(ファイルに保存せずに)ある配列に読み取り、それを操作してから、次のブロックを配列に読み取ります。等々。
私はなんとかそれを1つのブロックを読むようにしました:
def main():
sourceFile = 'test.asc'
print 'Extracting points ...'
extF = open(sourceFile, 'r')
block, cursPos = readBlock(extF)
extF.close()
print 'Finished extraction'
def readBlock(extF):
countPnts = 0
extBlock = []
line = extF.readline()
while not line.startswith('#'):
extPnt = Point(*[float(j) for j in line.split()])
countPnts += 1
extBlock.append(extPnt)
line = extF.readline()
cursPos = extF.tell()
print 'Points:', countPnts
print 'Cursor position:', cursPos
return extBlock, cursPos
これは完全に機能しますが、データの1つのブロックに対してのみ機能します。コメントされた行間をあるブロックから別のブロックに繰り返すことはできません。カーソル位置を考えていたのですが、気づきませんでした。これについてのヒントを教えてください。ありがとうございました。
アップデート 私はMattHのアイデアを次のように実装しました。
def blocks(seq):
buff = []
for line in seq:
if line.startswith('#'):
if buff:
#yield "".join(buff)
buff = []
else:
# I need to make those numbers float
line_spl = line.split()
pnt = [float(line_spl[k]) for k in range(len(line_spl))]
#print pnt
buff.append(Point(*pnt))
if buff:
yield "".join(buff)
次に、それを実行すると:
for block in blocks(extF.readlines()):
print 'p'
-loopprint 'p'
の中にありますが、ウィンドウが空です。for
したがって、いくつかの質問があります。
何ですか
if buff:
yield "".join(buff)
行う?コメントしても何も変わりません...
-loop内のコマンドがfor
機能しないのはなぜですか?
この関数はジェネレーターなので、以前に処理された行にアクセスできませんか?
解決
MattHとAshwiniChaudhariのアイデアを使って自分でそれを行うことができました。最後に、私はこれを手に入れました:
def readBlock(extF):
countPnts = 0
extBlock = []
line = extF.readline()
if line.startswith('#'):
line = extF.readline()
else:
while not line.startswith('#'):
extPnt = Point(*[float(j) for j in line.split()])
countPnts += 1
extBlock.append(extPnt)
line = extF.readline()
return extBlock, countPnts
そしてそれを実行します:
while extF.readline():
block, pntNum = readBlock(extF)
必要に応じて正確に機能します。
みんなありがとう。