(file1) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 10 # 1列めの文字列は同じだが、3列めの数字が2以上増えている。 GLY B 10 GLY B 10 GLY B 10 TRP B 11 TRP B 11 TRP B 11 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 13 ILE B 13
(file2) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 4 GLY B 4 GLY B 4 GLY B 4 TRP B 5 TRP B 5 TRP B 5 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 7 ILE B 7
file1をfile2のように書き換えたいです。
具体的には
・3列めの数字が前の行より2以上増えているとき、(その前の行の3列めの数+1)に変更する。
・1列めの文字列が同じ行では3列めの数字を同じにする。
ただし、file1で1列めの文字列が同じでも、3列めの数字が2以上増えているとき、(その前の行の3列めの数+1)に変更する。
file1を2行目から読み込んだfile1_2を作成し、1行ずつ比較していたのですが、3列目の数字を変えても、その次の行の数字を前行に揃えることができず、このやり方では無理と判断しました。
python
1path = 'file1' 2 3with open(path) as f: #file1の2行目からを取り出したfile1_2を作成 4 next(f) 5 for line in f: 6 fileobj = open("file1_2","a") 7 print >> fileobj, line.rstrip() 8 9path = 'file1' 10path2 = 'file1_2' 11f = open(path).readlines() 12f2 = open(path2).readlines() 13 14for (line, line2) in zip(f, f2): 15 line_res = line[0:3] 16 line_num = line[7:9] 17 line2_res = line2[0:3] 18 line2_num = line2[7:9] 19 if (line_res == line2_res) and (line_num == line2_num): 20 #file1とfile1_2の1列目と3列目が同じならば、file1をそのまま出力 21 fileobj = open("file2","a") 22 print >> fileobj, line.rstrip() 23 elif (line_res != line2_res) and ((int(line_num) + 1) == (int(line2_num))): 24 #file1とfile1_2の1列目が違うかつ3列目が1増えているならば、file1をそのまま出力 25 fileobj = open("file2","a") 26 print >> fileobj, line.rstrip() 27 elif (line_res != line2_res) and ((int(line_num) + 1) != (int(line2_num))): 28 #file1とfile1_2の1列目が違うかつ3列目が2以上増えているとき、3列目をfile1の3列目の数字+1にして出力 29 line_num_1 = ((int(line_num)) + 1) 30 line_num_2 = (str(line_num_1)).rjust(1) 31 tmp = line[:30] + line_num_2 + line[33:] 32 fileobj = open("file2","a") 33 print >> fileobj, tmp.rstrip() 34
(file1) (file1_2) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 10 GLY B 10 GLY B 10 GLY B 10 GLY B 10 GLY B 10 GLY B 10 GLY B 10 TRP B 11 TRP B 11 TRP B 11 TRP B 11 TRP B 11 TRP B 11 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 13 ILE B 13 ILE B 13 ILE B 13
しかし、この方法では
(file2) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 4 GLY B 10 GLY B 10 GLY B 10 TRP B 11 TRP B 11 TRP B 11 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 7 ILE B 13
となってしまいます。
前の行の変更を反映して次の行に移るようにするにはどうすればよいのでしょうか。
それとも他にやりようがあるのでしょうか。
コードをご提示ください。
追加しました。ご確認お願いします。
回答1件
あなたの回答
tips
プレビュー