データが固定幅レコードの固定幅フィールドであるように見えるので、struct
モジュールを使用すると、各行を個々のフィールドに素早く分割できます。
各行のすべてのフィールドを解析すると、そのうちの1つだけを処理する必要がある場合は残念ですが、他の処理を行う必要がある場合に備えて、 struct
モジュールはどんな場合でも比較的高速になります。
のは、入力ファイルはデータの唯一の次の行から成って言ってみましょう:あなたがする必要があるのは、フィールドの値がそれの比較を可能にするために、前の行にあったものを覚えていている
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 139 C1 DPPC 18 17.250 58.420 10.850 1.00 0.00
ATOM 189 C1 DPPC 19 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 19 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 19 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 19 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 19 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 19 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 19 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 20 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 20 23.050 20.800 11.000 1.00 0.00
ATOM 189 C1 DPPC 20 23.050 20.800 11.000 1.00 0.00
現在のもの。処理を開始するには、最初の行を別々に読み込んで解析する必要があります。したがって、後続の行と比較する値はprev
です。また、第5フィールドは、[4]
によってインデックスされたフィールドで、最初は[0]
で始まるためです。
import struct
# negative widths represent ignored padding fields
fieldwidths = 4, -4, 3, -2, 2, -2, 4, -3, 2, -6, 6, -2, 6, -2, 6, -2, 4, -2, 4
fmtstring = ' '.join('{}{}'.format(abs(fw), 'x' if fw < 0 else 's')
for fw in fieldwidths)
fieldstruct = struct.Struct(fmtstring)
parse = fieldstruct.unpack_from # a function to split line up into fields
with open('test_file.pdb') as f1:
prev = parse(next(f1))[4] # remember value of fifth field
cnt = 1
for line in f1:
curr = parse(line)[4] # get value of fifth field
if curr == prev: # same as last one?
cnt += 1
else:
print('{} occurred {} times'.format(prev, cnt))
prev = curr
cnt = 1
print('{} occurred {} times'.format(prev, cnt)) # for last line
出力:
18 occurred 9 times
19 occurred 7 times
20 occurred 3 times
私はあなたの問題を正しく理解していますか? 5番目のフィールドに '18'という50行のブロックがあり、その後に '19'などのブロックが続くことを確認しますか? –
'A'を' line.strip()[22:26] 'と定義します。' line'は 'i'番目の行です。 Sowhatは 'A [i + 1]'を意味しますか? –
はい、exacltyです。この特定のケースでは、第5列に18,19などがいくつ含まれているかを知りたいと思います。 – Diana