2017-09-05 13 views
0

J'ai plusieurs listes:L'écriture simultanée, dans plusieurs fichiers, les éléments de listes de différentes longueurs

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'] 

Et je voudrais générer 2 fichiers, du nom de l'élément de la liste VOLUMES: 119.823364.dat et 121.143469.dat , tel que chacun contient les éléments suivants:

fichier 119.823364.dat:

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 

fichier:

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 

Il y a la question suivante:

len(VOLUMES) = len(P0) = len(P2) = 2

Mais:

len(Xs) = len(Ys) = len(Zs) = 6

Je suis parvenu à réaliser la première partie:

# 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)) 

Ce qui crée les éléments suivants:

fichier 119.823364.dat:

some stuff 
other stuff 
4.97568007 16.76591397 
3 

fichier 121.143469.dat:

some stuff 
other stuff 
4.98494429 16.88768068 
3 

Je ne parviens pas à écrire les informations de Xs, Ys, Zs et ATOMIC_NUMBERS parce que ces 4 les listes ont une longueur différente des deux P0 et P2.

j'ai réussi à ré-écrire Xs, Ys, Zs et ATOMIC_NUMBERS en un seul 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 

qui imprime les éléments suivants:

[[['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']]] 

Je ne sais pas si la création de ce list of list of lists est la solution pour pouvoir boucler avec for i in xrange(len(P0)): mais je n'arrive pas à accomplir cela.

En pratique, la liste VOLUMES aura une longueur d'environ 50 articles.

+0

Vos '119.823364.dat' et' 121.143469.dat' sont identiques. –

+0

@Arda Arslan Je viens d'éditer le post –

Répondre

1

Utilisez zip pour construire vos lignes, et diviser le résultat en len(rows)/len(volumes) blocs -sized. Ensuite, écrivez chaque bloc dans son fichier respectif.

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') 

fichier 119.823364.dat contiendra:

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 

Notez que cette approche est dynamique et travaillera pour une VOLUMES de toute longueur.

+0

Merci beaucoup pour votre réponse. Cependant, comme indiqué dans la 3ème ligne de texte dans la question, je cherchais à obtenir les fichiers '119.823364.dat' et' 121.143469.dat' avec aussi 'quelques trucs 'avant et après le contenu des listes. J'ai essayé de faire 'f.write (" "" quelques trucs autre chose "" "+ ligne + \ n +" "" autre chose autre chose \ n "" ")' mais cela ne fonctionne pas. Comment est-ce que j'ai pu réaliser cela, c'est-à-dire comme le résultat du fichier '119.823364.dat' (3ème ligne du post)? Merci beaucoup –

+0

@DavidC .: Vous pouvez modifier la liste des lignes avant/après l'ajout des valeurs. Je vais modifier ma réponse pour résoudre ce problème. –

+0

Merci beaucoup pour votre aide plus qu'utile –

0

Ce qui suit va créer 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') 

Vous suivraient un processus similaire pour la création 121.143469.dat