How to interate over N lines of a text file in Python

╄→尐↘猪︶ㄣ 提交于 2020-01-17 05:55:12

问题


Hello I'm trying to convert the file disp.txt from:

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

to disp.mol:

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 ...

I opened the disp.txt file using with open('disp.txt', 'w') as f:

Read in the lines using lines = f.readlines()

split the data using for x in lines: numbers = x.split()

then vib1.append(float(numbers[2])), vib2.append and stored them in vib1=[], vib2=[], etc.

My problem arises when I need to put the data that I've stored in the format in disp.mol. With the code below I'm able to get output for the first three vibrations from the first two lines but I'm not sure how to perform the same loop on the next two 2 lines (as well as if I had more 2N lines). I'm also not sure how to number each vibration. Any help with this would be appreciated.

with open('disp.mol', 'w') as thisfile:
        thisfile.writelines('vibration')
        thisfile.writelines('\n')
        for x in range (0, 2):
                vib_one = str(vib1[x]) + '  ' +  str(vib2[x]) + '  ' +  str(vib3[x])
                thisfile.writelines(vib_one)
                thisfile.writelines('\n')
        thisfile.writelines('vibration')
        thisfile.writelines('\n')
        for x in range (0, 2):
                vib_two = str(vib4[x]) + '  ' +  str(vib5[x]) + '  ' +  str(vib6[x])
                thisfile.writelines(vib_two)
                thisfile.writelines('\n')
        thisfile.writelines('vibration')
        thisfile.writelines('\n')
        for x in range (0, 2):
                vib_three = str(vib7[x]) + '  ' +  str(vib8[x]) + '  ' +  str(vib9[x])
                thisfile.writelines(vib_three)
                thisfile.writelines('\n')

Output:

vibration
0.12  -0.91  0.39
0.0  -0.02  0.0
vibration
-0.4  0.31  0.85
-0.05  0.05  0.12
vibration
-0.66  -0.18  -0.22
-0.57  -0.26  -0.29

回答1:


Here's a way to do it:

with open('disp.txt') as f, open('disp.mol','w') as out:
    vibration = 1
    for line in f:
        line1 = line.split()
        line2 = next(f).split() # also get next line
        for i in range(2,len(line1),3):
            out.write('vibration {}\n'.format(vibration))
            out.write(' '.join(line1[i:i+3])+'\n')
            out.write(' '.join(line2[i:i+3])+'\n')
            vibration += 1

Output:

vibration 1
0.12 -0.91 0.39
0.00 -0.02 0.00
vibration 2
-0.40 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
0.01 0.09 0.19
0.47 -0.33 -0.79
vibration 6
-0.71 -0.21 -0.26
0.57 0.16 0.19


来源:https://stackoverflow.com/questions/40386544/how-to-interate-over-n-lines-of-a-text-file-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!