问题
I have several lists:
VOLUMES = ['119.823364', '121.143469']
P0 = ['4.97568007', '4.98494429']
P2 = ['16.76591397', '16.88768068']
Xs = ['0.000000000000E+00', '3.333333333333E-01', '-4.090760942850E-01', '0.000000000000E+00', '3.333333333333E-01', '-4.093755657782E-01']
Ys = ['0.000000000000E+00', '-3.333333333333E-01', '-3.333333333333E-01', '0.000000000000E+00', '-3.333333333333E-01', '-3.333333333333E-01']
Zs = ['0.000000000000E+00', '-8.333333333333E-02', '-8.333333333333E-02', '0.000000000000E+00', '-8.333333333333E-02', '-8.333333333333E-02']
ATOMIC_NUMBERS = ['20', '6', '8', '20', '6', '8']
And I would like to generate 2 files, named with the item of the VOLUMES list: 119.823364.dat and 121.143469.dat, such as each one contain the following:
119.823364.dat file:
some stuff
other stuff
4.97568007 16.76591397
3
20 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00
6 3.333333333333E-01 -3.333333333333E-01 -8.333333333333E-02
8 -4.090760942850E-01 -3.333333333333E-01 -8.333333333333E-02
other stuff
some other stuff
121.143469.dat file:
some stuff
other stuff
4.98494429 16.88768068
3
20 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00
6 3.333333333333E-01 -3.333333333333E-01 -8.333333333333E-02
8 -4.093755657782E-01 -3.333333333333E-01 -8.333333333333E-02
other stuff
some other stuff
There is the following issue:
len(VOLUMES) = len(P0) = len(P2) = 2
But:
len(Xs) = len(Ys) = len(Zs) = 6
I have managed to achieve the first part:
# Remove *.dat files, to clean first:
for f in glob.glob("*.dat"):
os.remove(f)
# Create the files:
filenames = []
for V in VOLUMES:
filename = "{}.dat".format(V)
print 'filename = ', filename
filenames.append(filename)
print filenames
# Write to files:
for i in xrange(len(P0)):
with open(filenames[i],'w') as f:
f.write("""some stuff
other stuff\n""")
f.write("{} {}\n".format(P0[i], P2[i]))
f.write("{}\n".format(N_atom_irreducible_unit))
Which creates the following:
119.823364.dat file:
some stuff
other stuff
4.97568007 16.76591397
3
121.143469.dat file:
some stuff
other stuff
4.98494429 16.88768068
3
I cannot manage to write the information from Xs, Ys, Zs and ATOMIC_NUMBERS because these 4 lists have different length than both P0 and P2.
I managed to re-write Xs, Ys, Zs and ATOMIC_NUMBERS into one single list of list of lists:
for index_vol in range(len(VOLUMES)):
for index in range(len(ATOMIC_NUMBERS)):
atoms_per_frame = [ATOMIC_NUMBERS[index], Xs[index], Ys[index], Zs[index]]
atoms_all_frames[index_vol].append(atoms_per_frame)
print atoms_all_frames
which prints the following:
[[['20', '0.000000000000E+00', '0.000000000000E+00', '0.000000000000E+00'], ['6', '3.333333333333E-01', '-3.333333333333E-01', '-8.333333333333E-02'], ['8', '-4.090760942850E-01', '-3.333333333333E-01', '-8.333333333333E-02'], ['20', '0.000000000000E+00', '0.000000000000E+00', '0.000000000000E+00'], ['6', '3.333333333333E-01', '-3.333333333333E-01', '-8.333333333333E-02'], ['8', '-4.093755657782E-01', '-3.333333333333E-01', '-8.333333333333E-02']], [['20', '0.000000000000E+00', '0.000000000000E+00', '0.000000000000E+00'], ['6', '3.333333333333E-01', '-3.333333333333E-01', '-8.333333333333E-02'], ['8', '-4.090760942850E-01', '-3.333333333333E-01', '-8.333333333333E-02'], ['20', '0.000000000000E+00', '0.000000000000E+00', '0.000000000000E+00'], ['6', '3.333333333333E-01', '-3.333333333333E-01', '-8.333333333333E-02'], ['8', '-4.093755657782E-01', '-3.333333333333E-01', '-8.333333333333E-02']]]
I do not know if creating this list of list of lists is the solution for being able to loop together with for i in xrange(len(P0)): but I cannot manage to accomplish this.
In practice, the VOLUMES list will be of length around ~ 50 items.
回答1:
Use zip to build your lines, and split the result into len(rows) / len(volumes)-sized blocks. Then, write each block to its respective file.
headers = list(zip(P0, P2))
rows = [row for row in zip(ATOMIC_NUMBERS, Xs, Ys, Zs)]
interval = int(len(rows) / len(VOLUMES))
for block_i, vol_i in zip(range(0, len(rows), interval), range(len(VOLUMES))):
# Create the lines for the file
lines = [' '.join(headers[vol_i]), '3']
lines += [' '.join(row) for row in rows[block_i : block_i + interval]]
# Write the file
with open(VOLUMES[vol_i] + '.dat', 'w') as f:
# Preceding lines
f.write('some stuff\nother stuff')
# Lines of data
for line in lines:
f.write(line + '\n')
# Trailing lines
f.write('other stuff\nsome other stuff')
File 119.823364.dat will contain:
some stuff
some other stuff
4.97568007 16.76591397
3
20 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00
6 3.333333333333E-01 -3.333333333333E-01 -8.333333333333E-02
8 -4.090760942850E-01 -3.333333333333E-01 -8.333333333333E-02
other stuff
some other stuff
Note that this approach is dynamic and will work for a VOLUMES of any length.
回答2:
The following will create 119.823364.dat:
VOLUMES = ['119.823364', '121.143469']
P0 = ['4.97568007', '4.98494429']
P2 = ['16.76591397', '16.88768068']
Xs = ['0.000000000000E+00', '3.333333333333E-01', '-4.090760942850E-01',
'0.000000000000E+00', '3.333333333333E-01', '-4.093755657782E-01']
Ys = ['0.000000000000E+00', '-3.333333333333E-01', '-3.333333333333E-01',
'0.000000000000E+00', '-3.333333333333E-01', '-3.333333333333E-01']
Zs = ['0.000000000000E+00', '-8.333333333333E-02', '-8.333333333333E-02',
'0.000000000000E+00', '-8.333333333333E-02', '-8.333333333333E-02']
ATOMIC_NUMBERS = ['20', '6', '8', '20', '6', '8']
with open('{}.dat'.format(VOLUMES[0]), 'w+') as file:
file.write('some stuff \n')
file.write('other stuff \n')
for item in P0:
file.write('{} '.format(item))
file.write('\n')
file.write('3 \n')
for i in range(3):
file.write('{} {} {} {} \n'.format(ATOMIC_NUMBERS[i],
Xs[i], Ys[i], Zs[i]))
file.write('other stuff')
You'd follow a similar process for creating 121.143469.dat
来源:https://stackoverflow.com/questions/46061013/writing-simultaneously-into-several-files-the-elements-of-lists-of-different-l