2016-11-11 99 views
0

我發佈了一個關於How to interate over N lines of a text file in Python的問題,但我想讓該程序更適用於N行(例如,而不是必須一次收集兩行採取四個或六個線路在同一時間在循環中遍歷N行,然後轉到下一個循環

我希望把這個disp.txt:

116 C    0.12 -0.91 0.39 -0.40 0.31 0.85 -0.66 -0.18 -0.22 
117 O    0.00 -0.02 0.00 -0.05 0.05 0.12 -0.57 -0.26 -0.29 
116 C   -0.03 -0.04 0.00  0.01 0.09 0.19 -0.71 -0.21 -0.26 
117 O   -0.14 0.88 -0.45  0.47 -0.33 -0.79  0.57 0.16 0.19 

要這樣:

vibration 1 
0.12 -0.91 0.39 
0.0 -0.02 0.0 
vibration 2 
-0.4 0.31 0.85 
-0.05 0.05 0.12 
vibration 3 
-0.66 -0.18 -0.22 
-0.57 -0.26 -0.29 
vibration 4 
-0.03 -0.04 0.00 
-0.14 0.88 -0.45 
vibration 5 ... 

下面是我到目前爲止

vibration = 1 
with open('disp1.txt','r') as f, open('disp2.txt', 'w') as out: 

while True: 
    next_lines = list(islice(f,2)) 
    m = next_lines 
    for i in m: 
    s = i.strip().split('\n') 
    for j in s: 
    p = j.split() 
    v = len(p) 
    for u in range(2,5,3): 
    out.write('vibration {}\n'.format(vibration)) 
    out.write(' '.join(p[u:u+3])+'\n') 
    vibration += 1 
    for x in range(5,8,3): 
    out.write(' '.join(p[x:x+3])+'\n') 
    for y in range(8,11,3): 
     out.write(' '.join(p[y:y+3])+'\n') 
    if not next_lines: 
    break 

該圖是這樣的:

vibration 1 
0.12 -0.91 0.39 
-0.40 0.31 0.85 
-0.66 -0.18 -0.22 
vibration 2 
0.00 -0.02 0.00 
-0.05 0.05 0.12 
-0.57 -0.26 -0.29 
vibration 3 
-0.03 -0.04 0.00 
0.01 0.09 0.19 
-0.71 -0.21 -0.26 
vibration 4 
-0.14 0.88 -0.45 
0.47 -0.33 -0.79 
0.57 0.16 0.19 

所以它的閱讀在整個頁面,而不是閱讀數前三列的前兩行,然後繼續下一組的三個等等。 通過使用isplice它一次讀兩行,但由於我不明白這兩個行都不通過第一個循環(對於範圍(2,5,3):)中的u(在範圍內(2,5,3):),對於範圍內的x(5,8,3):) 取而代之的是將每條線貫穿每個循環。 任何人都可以幫助我嗎?

謝謝。

+0

但0.12 -0.91 0.39 -0.40 0.31 0.85 -0.66 - 0.18 -0.22是一行! –

+0

另外,請使用下面的代碼:http://www.pythontutor.com/visualize.html#mode=edit –

+0

我的答案是否有效?如果是這樣,請將其標爲正確(綠色檢查)。 –

回答

0
info = '''0.12 -0.91 0.39 -0.40 0.31 0.85 -0.66 -0.18 -0.22 0.00 -0.02 0.00 -0.05 0.05 0.12 -0.57 -0.26 -0.29 -0.03 -0.04 0.00 0.01 0.09 0.19 -0.71 -0.21 -0.26 -0.14 0.88 -0.45 0.47 -0.33 -0.79  0.57 0.16 0.19''' 

new_list_1 = info.split(' ') 
vib_1 = new_list_1[0] + '\n' + new_list_1[3] 
vib_1 = 'vibration 1' + '\n' + vib_1 
print vib_1 

new_list_2 = info.split(' ') 
vib_2 = new_list_2[1] + '\n' + new_list_2[4] 
vib_2 = 'vibration 2' + '\n' + vib_2 
print vib_2 

new_list_3 = info.split(' ') 
vib_3 = new_list_3[2] + '\n' + new_list_3[5] 
vib_3 = 'vibration 3' + '\n' + vib_3 
print vib_3 
1

這應該做你想做的。

def group(lst, size = 3): 
    """ 
    returns a list of lists where the inner lists are at most 
    of length size 

    [1, 2, 3, 4, 5, 6] -> [[1, 2, 3], [4, 5, 6]] 
    group(list, int) -> list<list> 
    """ 
    return [lst[i:i+size] for i in range(0, len(lst), size)] 

def get_vibrations(lines): 
    for vibration in zip(*[group(line) for line in lines]): 
     yield '\n'.join(' '.join(v) for v in vibration) 

def main(n): 
    with open('in.txt', 'r') as fin, open('out.txt', 'w') as fout: 
     i = 0 
     for line in fin: 
      line = line.strip().split()[2:] 
      vibrations = [line] + [fin.readline().strip().split()[2:] for _ in range(n - 1)] 

      # write each vibration to the file 
      for i, v in enumerate(get_vibrations(vibrations), start = i + 1): 
       fout.write('vibration {}\n{}\n'.format(i, v)) 

if __name__ == '__main__': 
    main(4) # the number of lines per vibration 

# Input 
116 C    0.12 -0.91 0.39 -0.40 0.31 0.85 -0.66 -0.18 -0.22 
117 O    0.00 -0.02 0.00 -0.05 0.05 0.12 -0.57 -0.26 -0.29 
116 C   -0.03 -0.04 0.00  0.01 0.09 0.19 -0.71 -0.21 -0.26 
117 O   -0.14 0.88 -0.45  0.47 -0.33 -0.79  0.57 0.16 0.19 
116 C    0.26 -0.40 -0.83  0.26 0.31 0.25  0.33 0.71 -0.51 
117 O   -0.19 -0.39 -0.36 -0.40 0.87 0.49  0.11 0.26 -0.57 
116 C   -0.35 0.27 0.79 -0.03 -0.71 -0.18  0.93 -0.89 -0.81 
117 O   -0.84 0.99 0.38 -0.27 -0.33 0.55  0.31 0.99 -0.18 
116 C    0.76 -0.77 0.71  0.19 -0.39 0.46  0.30 -0.15 0.71 
117 O   -0.97 0.31 0.58 -0.42 0.16 -0.33 -0.39 -0.17 -0.54 

# Output 
vibration 1 
0.12 -0.91 0.39 
0.00 -0.02 0.00 
-0.03 -0.04 0.00 
-0.14 0.88 -0.45 
vibration 2 
-0.40 0.31 0.85 
-0.05 0.05 0.12 
0.01 0.09 0.19 
0.47 -0.33 -0.79 
vibration 3 
-0.66 -0.18 -0.22 
-0.57 -0.26 -0.29 
-0.71 -0.21 -0.26 
0.57 0.16 0.19 
vibration 4 
0.26 -0.40 -0.83 
-0.19 -0.39 -0.36 
-0.35 0.27 0.79 
-0.84 0.99 0.38 
vibration 5 
0.26 0.31 0.25 
-0.40 0.87 0.49 
-0.03 -0.71 -0.18 
-0.27 -0.33 0.55 
vibration 6 
0.33 0.71 -0.51 
0.11 0.26 -0.57 
0.93 -0.89 -0.81 
0.31 0.99 -0.18 

如果您還想允許不夠線,那麼你可以添加

from itertools import zip_longest 

,並切換到這個

def get_vibrations(lines): 
    for vibration in zip_longest(*[group(line) for line in lines], fillvalue = ['null']): 
     yield '\n'.join(' '.join(v) for v in vibration) 

# Outputs | added to above output 
vibration 7 
0.76 -0.77 0.71 
-0.97 0.31 0.58 
null 
null 
vibration 8 
0.19 -0.39 0.46 
-0.42 0.16 -0.33 
null 
null 
vibration 9 
0.30 -0.15 0.71 
-0.39 -0.17 -0.54 
null 
null 
+0

當我使用每個振動的行數作爲兩個腳本運行腳本時,我得到:Traceback(最近呼叫的最後一個): 文件「check」,第29行,在 main(2)#每個振動的行數 File在主 振動= [line] + [fin.readline()。strip()。split()[2:] for _in range(n - 1)]中檢查第012行, ValueError:混合迭代和閱讀方法會丟失數據 – Tillie

+0

我要通過你的腳本去看看我能否更好地理解它,謝謝。 – Tillie

+0

這很奇怪,我沒有得到任何錯誤。你用的是什麼python版本,3?你是否嘗試過我的代碼或嘗試先將它實現到你的代碼中? –