2017-09-06 3 views
0

J'ai un fichier avec cette structure:Extraire les informations et processus entre deux chaînes, ces chaînes étant répété plusieurs fois le long du fichier

LATTICE PARAMETERS (ANGSTROMS AND DEGREES) - BOHR = 0.5291772083 ANGSTROM 
PRIMITIVE CELL - CENTRING CODE 7/0 VOLUME= 122.771603 - DENSITY 2.704 g/cm^3 
     A    B    C   ALPHA  BETA  GAMMA 
    6.32540491  6.32540491  6.32540491 46.774144 46.774144 46.774144 
******************************************************************************* 
ATOMS IN THE ASYMMETRIC UNIT 3 - ATOMS IN THE UNIT CELL: 10 
    ATOM     X/A     Y/B     Z/C 
******************************************************************************* 
     1 T 20 CA 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 
     2 F 20 CA -5.000000000000E-01 -5.000000000000E-01 -5.000000000000E-01 
     3 T 6 C  2.500000000000E-01 2.500000000000E-01 2.500000000000E-01 
     4 F 6 C -2.500000000000E-01 -2.500000000000E-01 -2.500000000000E-01 
     5 T 8 O -4.912600492192E-01 -8.739950780750E-03 2.500000000000E-01 
     6 F 8 O  2.500000000000E-01 -4.912600492193E-01 -8.739950780750E-03 
     7 F 8 O -8.739950780750E-03 2.500000000000E-01 -4.912600492193E-01 
     8 F 8 O  4.912600492193E-01 8.739950780750E-03 -2.500000000000E-01 
     9 F 8 O -2.500000000000E-01 4.912600492193E-01 8.739950780750E-03 
    10 F 8 O  8.739950780750E-03 -2.500000000000E-01 4.912600492193E-01 

TRANSFORMATION MATRIX PRIMITIVE-CRYSTALLOGRAPHIC CELL 
    1.0000 0.0000 1.0000 -1.0000 1.0000 1.0000 0.0000 -1.0000 1.0000 

******************************************************************************* 
CRYSTALLOGRAPHIC CELL (VOLUME=  368.31480902) 
     A    B    C   ALPHA  BETA  GAMMA 
    5.02162261  5.02162261 16.86554607 90.000000 90.000000 120.000000 

COORDINATES IN THE CRYSTALLOGRAPHIC CELL 
    ATOM     X/A     Y/B     Z/C 
******************************************************************************* 
     1 T 20 CA 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 
     2 F 20 CA 0.000000000000E+00 0.000000000000E+00 -5.000000000000E-01 
     3 T 6 C  3.333333333333E-01 -3.333333333333E-01 -8.333333333333E-02 
     4 F 6 C -3.333333333333E-01 3.333333333333E-01 8.333333333333E-02 
     5 T 8 O -4.079267158859E-01 -3.333333333333E-01 -8.333333333333E-02 
     6 F 8 O  3.333333333333E-01 -7.459338255258E-02 -8.333333333333E-02 
     7 F 8 O  7.459338255258E-02 4.079267158859E-01 -8.333333333333E-02 
     8 F 8 O  4.079267158859E-01 3.333333333333E-01 8.333333333333E-02 
     9 F 8 O -3.333333333333E-01 7.459338255258E-02 8.333333333333E-02 
    10 F 8 O -7.459338255258E-02 -4.079267158859E-01 8.333333333333E-02 

T = ATOM BELONGING TO THE ASYMMETRIC UNIT 


more lines 
more lines 
more lines 

FINAL OPTIMIZED GEOMETRY - DIMENSIONALITY OF THE SYSTEM  3 
(NON PERIODIC DIRECTION: LATTICE PARAMETER FORMALLY SET TO 500) 
******************************************************************************* 
LATTICE PARAMETERS (ANGSTROMS AND DEGREES) - BOHR = 0.5291772083 ANGSTROM 
PRIMITIVE CELL - CENTRING CODE 7/0 VOLUME= 119.823364 - DENSITY 2.770 g/cm^3 
     A    B    C   ALPHA  BETA  GAMMA 
    6.28373604  6.28373604  6.28373604 46.646397 46.646397 46.646397 
******************************************************************************* 
ATOMS IN THE ASYMMETRIC UNIT 3 - ATOMS IN THE UNIT CELL: 10 
    ATOM     X/A     Y/B     Z/C 
******************************************************************************* 
     1 T 20 CA 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 
     2 F 20 CA -5.000000000000E-01 -5.000000000000E-01 -5.000000000000E-01 
     3 T 6 C  2.500000000000E-01 2.500000000000E-01 2.500000000000E-01 
     4 F 6 C -2.500000000000E-01 -2.500000000000E-01 -2.500000000000E-01 
     5 T 8 O -4.924094276183E-01 -7.590572381674E-03 2.500000000000E-01 
     6 F 8 O  2.500000000000E-01 -4.924094276183E-01 -7.590572381674E-03 
     7 F 8 O -7.590572381674E-03 2.500000000000E-01 -4.924094276183E-01 
     8 F 8 O  4.924094276183E-01 7.590572381674E-03 -2.500000000000E-01 
     9 F 8 O -2.500000000000E-01 4.924094276183E-01 7.590572381674E-03 
    10 F 8 O  7.590572381674E-03 -2.500000000000E-01 4.924094276183E-01 

TRANSFORMATION MATRIX PRIMITIVE-CRYSTALLOGRAPHIC CELL 
    1.0000 0.0000 1.0000 -1.0000 1.0000 1.0000 0.0000 -1.0000 1.0000 

******************************************************************************* 
CRYSTALLOGRAPHIC CELL (VOLUME=  359.47009054) 
     A    B    C   ALPHA  BETA  GAMMA 
    4.97568007  4.97568007 16.76591397 90.000000 90.000000 120.000000 

COORDINATES IN THE CRYSTALLOGRAPHIC CELL 
    ATOM     X/A     Y/B     Z/C 
******************************************************************************* 
     1 T 20 CA 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 
     2 F 20 CA -5.491739570355E-17 -2.745869785177E-17 -5.000000000000E-01 
     3 T 6 C  3.333333333333E-01 -3.333333333333E-01 -8.333333333333E-02 
     4 F 6 C -3.333333333333E-01 3.333333333333E-01 8.333333333333E-02 
     5 T 8 O -4.090760942850E-01 -3.333333333333E-01 -8.333333333333E-02 
     6 F 8 O  3.333333333333E-01 -7.574276095166E-02 -8.333333333333E-02 
     7 F 8 O  7.574276095166E-02 4.090760942850E-01 -8.333333333333E-02 
     8 F 8 O  4.090760942850E-01 3.333333333333E-01 8.333333333333E-02 
     9 F 8 O -3.333333333333E-01 7.574276095166E-02 8.333333333333E-02 
    10 F 8 O -7.574276095166E-02 -4.090760942850E-01 8.333333333333E-02 

T = ATOM BELONGING TO THE ASYMMETRIC UNIT 
INFORMATION **** fort.34 **** GEOMETRY OUTPUT FILE 

more lines 
more lines 
more lines 

FINAL OPTIMIZED GEOMETRY - DIMENSIONALITY OF THE SYSTEM  3 
(NON PERIODIC DIRECTION: LATTICE PARAMETER FORMALLY SET TO 500) 
******************************************************************************* 
LATTICE PARAMETERS (ANGSTROMS AND DEGREES) - BOHR = 0.5291772083 ANGSTROM 
PRIMITIVE CELL - CENTRING CODE 7/0 VOLUME= 121.143469 - DENSITY 2.740 g/cm^3 
     A    B    C   ALPHA  BETA  GAMMA 
    6.32229536  6.32229536  6.32229536 46.436583 46.436583 46.436583 
******************************************************************************* 
ATOMS IN THE ASYMMETRIC UNIT 3 - ATOMS IN THE UNIT CELL: 10 
    ATOM     X/A     Y/B     Z/C 
******************************************************************************* 
     1 T 20 CA 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 
     2 F 20 CA 5.000000000000E-01 -5.000000000000E-01 -5.000000000000E-01 
     3 T 6 C  2.500000000000E-01 2.500000000000E-01 2.500000000000E-01 
     4 F 6 C -2.500000000000E-01 -2.500000000000E-01 -2.500000000000E-01 
     5 T 8 O -4.927088991116E-01 -7.291100888437E-03 2.500000000000E-01 
     6 F 8 O  2.500000000000E-01 -4.927088991116E-01 -7.291100888437E-03 
     7 F 8 O -7.291100888437E-03 2.500000000000E-01 -4.927088991116E-01 
     8 F 8 O  4.927088991116E-01 7.291100888437E-03 -2.500000000000E-01 
     9 F 8 O -2.500000000000E-01 4.927088991116E-01 7.291100888437E-03 
    10 F 8 O  7.291100888437E-03 -2.500000000000E-01 4.927088991116E-01 

TRANSFORMATION MATRIX PRIMITIVE-CRYSTALLOGRAPHIC CELL 
    1.0000 0.0000 1.0000 -1.0000 1.0000 1.0000 0.0000 -1.0000 1.0000 

******************************************************************************* 
CRYSTALLOGRAPHIC CELL (VOLUME=  363.43040599) 
     A    B    C   ALPHA  BETA  GAMMA 
    4.98494429  4.98494429 16.88768068 90.000000 90.000000 120.000000 

COORDINATES IN THE CRYSTALLOGRAPHIC CELL 
    ATOM     X/A     Y/B     Z/C 
******************************************************************************* 
     1 T 20 CA 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 
     2 F 20 CA -5.471726358381E-17 -2.735863179191E-17 -5.000000000000E-01 
     3 T 6 C  3.333333333333E-01 -3.333333333333E-01 -8.333333333333E-02 
     4 F 6 C -3.333333333333E-01 3.333333333333E-01 8.333333333333E-02 
     5 T 8 O -4.093755657782E-01 -3.333333333333E-01 -8.333333333333E-02 
     6 F 8 O  3.333333333333E-01 -7.604223244490E-02 -8.333333333333E-02 
     7 F 8 O  7.604223244490E-02 4.093755657782E-01 -8.333333333333E-02 
     8 F 8 O  4.093755657782E-01 3.333333333333E-01 8.333333333333E-02 
     9 F 8 O -3.333333333333E-01 7.604223244490E-02 8.333333333333E-02 
    10 F 8 O -7.604223244490E-02 -4.093755657782E-01 8.333333333333E-02 

T = ATOM BELONGING TO THE ASYMMETRIC UNIT 
INFORMATION **** fort.34 **** GEOMETRY OUTPUT FILE 

more lines 
more lines 
more lines 

je voudrais extraire des informations de CRYSTALLOGRAPHIC CELL; mais seulement celui qui vient d'un FINAL OPTIMIZED GEOMETRY.

Les 3 matchs suivants:

initial_pattern = '^ FINAL OPTIMIZED GEOMETRY - DIMENSIONALITY OF THE SYSTEM  3$' 
middle_pattern = '^ CRYSTALLOGRAPHIC CELL ' 
end_pattern = '^ T = ATOM BELONGING TO THE ASYMMETRIC UNIT$' 

permettent de rechercher les informations.

Tout d'abord, je définir un drapeau passed_mid_point = False,

et la partie suivante du programme extrait le VOLUME de CRYSTALLOGRAPHIC CELL du FINAL OPTIMIZED GEOMETRY:

VOLUMES = [] 
with open('g.out') as file: 
    passed_mid_point = False 
    for line in file: 
     if re.match(initial_pattern, line): 
      passed_mid_point = False 
      print file.next() 
      print file.next() 
      print file.next() 

      volume_line = file.next() 
      print volume_line 
      aux = volume_line.split() 
      each_volume = aux[7] 
      print each_volume 
      VOLUMES.append(each_volume) 
print 'VOLUMES = ', VOLUMES 

qui est correct, parce que VOLUMES = ['119.823364', '121.143469']. Notez que le 122.771603 initial (voir le fichier d'origine) n'est pas rassemblé dans la liste, comme prévu.

Lors de l'extraction du A et C (dans mon programme, P0 et P1), les paramètres de CRYSTALLOGRAPHIC CELL du FINAL OPTIMIZED GEOMETRY, ainsi que les coordonnées:

 if re.match(middle_pattern, line): 
      passed_mid_point = True 

      print line 

      print file.next() 
      parameters_line = file.next() 
      aux = parameters_line.split() 
      p0 = aux[0] 
      p1 = aux[1] 
      p2 = aux[2] 
      p3 = aux[3] 
      p4 = aux[4] 
      p5 = aux[5] # 

      print p0 
      print p2 

      P0.append(p0) 
      P2.append(p2) 

      print file.next() 
      print file.next() 
      print file.next() 
      print file.next() 

     if re.match(end_pattern, line): 
      passed_mid_point = False 

     elif passed_mid_point: 
      # parse the coordinates 
      print 'line2 =', line 
      terms = line.split() 
      print 'terms =', terms 
#   print 'terms[1] =', terms[1] 

      if terms and terms[1] == 'T': 
       print terms[1] 
       atomic_number = terms[2] 
       print 'atomic_number = ', atomic_number 
       ATOMIC_NUMBERS.append(atomic_number) 

       x = terms[4] 
       print 'x =', x 
       Xs.append(x) 

       y = terms[5] 
       print 'y = ', y 
       Ys.append(y) 

       z = terms[6] 
       print 'z = ', z 
       Zs.append(z) 

print 'VOLUMES = ', VOLUMES 
print 'P0 = ', P0 
print 'P2 = ', P2 
print 'Xs = ', Xs 
print 'Ys = ', Ys 
print 'Zs = ', Zs 
print 'ATOMIC_NUMBERS = ', ATOMIC_NUMBERS 

Le résultat est le suivant:

P0 = ['5.02162261', '4.97568007', '4.98494429'] 

ce qui est faux, car 5.02162261 ne provient pas d'un FINAL OPTIMIZED GEOMETRY (voir le fichier).

Aussi les coordonnées sont erronées:

Xs = ['0.000000000000E+00', '3.333333333333E-01', '-4.079267158859E-01', '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', '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', '0.000000000000E+00', '-8.333333333333E-02', '-8.333333333333E-02'] 
ATOMIC_NUMBERS = ['20', '6', '8', '20', '6', '8', '20', '6', '8'] 

Ce serait le résultat souhaité:

VOLUMES = ['119.823364', '121.143469'] 
P0 = ['4.97568007', '4.98494429'] 
P1 = [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'] 

Je vous serais reconnaissant si vous pouviez me aider

code entier:

import sys 
import re 
import os 

initial_pattern = '^ FINAL OPTIMIZED GEOMETRY - DIMENSIONALITY OF THE SYSTEM  3$' 
middle_pattern = '^ CRYSTALLOGRAPHIC CELL ' 
end_pattern = '^ T = ATOM BELONGING TO THE ASYMMETRIC UNIT$' 

global N_atom_irreducible_unit 
N_atom_irreducible_unit = 3 

VOLUMES = [] 
P0 = [] 
P2 = [] 
ATOMIC_NUMBERS = [] 
Xs = [] 
Ys = [] 
Zs = [] 

with open('g.out') as file: 
    passed_mid_point = False 
    for line in file: 
     if re.match(initial_pattern, line): 
      passed_mid_point = False 
      print file.next() 
      print file.next() 
      print file.next() 

      volume_line = file.next() 
      print volume_line 
      aux = volume_line.split() 
      each_volume = aux[7] 
      print each_volume 
      VOLUMES.append(each_volume) 

     if re.match(middle_pattern, line): 
      passed_mid_point = True 

      print line 

      print file.next() 
      parameters_line = file.next() 
      aux = parameters_line.split() 
      p0 = aux[0] 
      p1 = aux[1] 
      p2 = aux[2] 
      p3 = aux[3] 
      p4 = aux[4] 
      p5 = aux[5] # 

      print p0 
      print p2 

      P0.append(p0) 
      P2.append(p2) 

      print file.next() 
      print file.next() 
      print file.next() 
      print file.next() 

     if re.match(end_pattern, line): 
      passed_mid_point = False 

     elif passed_mid_point: 
      # parse the coordinates 
      print 'line2 =', line 
      terms = line.split() 
      print 'terms =', terms 
#   print 'terms[1] =', terms[1] 

      if terms and terms[1] == 'T': 
       print terms[1] 
       atomic_number = terms[2] 
       print 'atomic_number = ', atomic_number 
       ATOMIC_NUMBERS.append(atomic_number) 

       x = terms[4] 
       print 'x =', x 
       Xs.append(x) 

       y = terms[5] 
       print 'y = ', y 
       Ys.append(y) 

       z = terms[6] 
       print 'z = ', z 
       Zs.append(z) 

print 'VOLUMES = ', VOLUMES 
print 'P0 = ', P0 
print 'P2 = ', P2 
print 'Xs = ', Xs 
print 'Ys = ', Ys 
print 'Zs = ', Zs 
print 'ATOMIC_NUMBERS = ', ATOMIC_NUMBERS 
+1

êtes-vous sûr que votre résultat souhaité est correct, puisque vous mentionnez le même numéro que vous désigner comme étant juste juste au-dessus (4.98494429)? –

+0

@Bart Van Loon Merci beaucoup pour votre commentaire, j'ai fait une faute de frappe. Voir la publication éditée. –

Répondre

1

J'ai écrit une version simplifiée de votre script, qui semble fonctionner. J'espère que cela peut compter comme point de départ de votre script final:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

VOLUMES = [] 
P0 = [] 
P2 = [] 
ATOMIC_NUMBERS = [] 
Xs = [] 
Ys = [] 
Zs = [] 

with open('g.out') as gout: 
    final_optimized_geometry = False 
    for line in gout: 
     if 'FINAL OPTIMIZED GEOMETRY' in line: 
      final_optimized_geometry = True 
     elif 'PRIMITIVE CELL' in line: 
      if not final_optimized_geometry: 
       continue 
      volume = line.split()[7] 
      VOLUMES.append(volume) 
     elif 'CRYSTALLOGRAPHIC CELL (VOLUME=' in line: 
      if not final_optimized_geometry: 
       continue 
      gout.readline() 
      line = gout.readline() 
      p0, p2 = line.split()[0:3:2] 

      P0.append(p0) 
      P2.append(p2) 
     elif 'COORDINATES IN THE CRYSTALLOGRAPHIC CELL' in line: 
      if not final_optimized_geometry: 
       continue 
      gout.readline() 
      gout.readline() 
      while 'T = ATOM BELONGING TO THE ASYMMETRIC UNIT' not in line: 
       line = gout.readline() 
       atomdata = line.split() 
       if not atomdata or atomdata[1] != 'T': 
        continue 
       atomicnumber = atomdata[2] 
       x, y, z = atomdata[4:7] 
       ATOMIC_NUMBERS.append(atomicnumber) 
       Xs.append(x) 
       Ys.append(y) 
       Zs.append(z) 
      final_optimized_geometry = False 


print(VOLUMES) 
print(P0) 
print(P2) 
print(ATOMIC_NUMBERS) 
print(Xs) 
print(Ys) 
print(Zs) 

Cela génère la sortie suivante:

['119.823364', '121.143469'] 
['4.97568007', '4.98494429'] 
['16.76591397', '16.88768068'] 
['20', '6', '8', '20', '6', '8'] 
['0.000000000000E+00', '3.333333333333E-01', '-4.090760942850E-01', '0.000000000000E+00', '3.333333333333E-01', '-4.093755657782E-01'] 
['0.000000000000E+00', '-3.333333333333E-01', '-3.333333333333E-01', '0.000000000000E+00', '-3.333333333333E-01', '-3.333333333333E-01'] 
['0.000000000000E+00', '-8.333333333333E-02', '-8.333333333333E-02', '0.000000000000E+00', '-8.333333333333E-02', '-8.333333333333E-02'] 

En fait, il est une machine à états finis très simple avec seulement deux états. Attention: cela ne fonctionnera pas s'il y a plusieurs cellules cristallographiques dans une géométrie finale optimisée. Dans ce cas, il ne capture que les informations de la première cellule.

Le code fait également d'autres hypothèses sur le fichier, qui peut-être doit être vérifié bien sûr.

J'éviter l'utilisation des expressions régulières.

Ce code ne fonctionnera en Python 3 (testé contre Python 3.6.2). Python 2.7 va s'étouffer en utilisant readline() à l'intérieur du bloc d'itération de fichier (ce qui a du sens, mais c'est génial de voir que Python 3 va bien avec ça). Nous utilisons readline() comme un petit hack pour ignorer les lignes du fichier d'entrée dont nous savons qu'elles doivent être ignorées, sans passer par toute la boucle (ce qui nécessiterait plus de variables flag). Par ailleurs, si votre seule tâche consiste à analyser les fichiers texte, il peut être intéressant de vérifier les langues dédiées, telles que Lex par exemple. En outre, Perl a été conçu pour faire des choses comme ça, plus que Python.

Espérons que cela aide!

+0

Votre code ne collecte pas les volumes corrects, c'est-à-dire '359.47009054' vs' 119.823364' (voir le résultat souhaité dans le message). De plus, pour l'extraction de "NUMÉROS ATOMIQUES", "Xs", "Ys" et "Zs" vous avez besoin d'une sorte de troisième correspondance, c'est-à-dire "end_pattern" (voir article) pour dire jusqu'à quel point ces 4 listes doivent être remplies avec des informations –

+0

Mon code est sur le point d'atteindre la bonne chose, mais 'P0',' P1', 'ATOMIQUE NUMBERS',' Xs', '' Ys' et Zs' se rassemblent également les informations de la « non-finale optimisé cellule cristallographique ", où ils ne devraient pas, et je ne sais pas où est le problème –

+1

Ne sont pas les volumes 121.143469 et 122.771603 des cellules primitives au lieu de cellules cristallographiques? Désolé si je me trompe, j'essaie juste d'interpréter le fichier 'g.out' sans rien savoir de son arrière-plan. –

0

Merci à tous l'aide de @Bart Van Loon, une version simplifiée du code serait:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

global N_atom_irreducible_unit 
N_atom_irreducible_unit = 3 

filename = 'g.out' 

VOLUMES = [] 
P0 = [] 
P2 = [] 
ATOMIC_NUMBERS = [] 
Xs = [] 
Ys = [] 
Zs = [] 

with open(filename) as gout: 
    final_optimized_geometry = False 
    for line in gout: 
     if 'FINAL OPTIMIZED GEOMETRY' in line: 
      final_optimized_geometry = True 
     elif 'PRIMITIVE CELL - CENTRING CODE' in line: 
      if final_optimized_geometry: 
       volume = line.split() 
       print volume 
       print volume[7] 
       volume = line.split()[7] 
       VOLUMES.append(volume) 

     elif ' CRYSTALLOGRAPHIC CELL (V' in line: 
      if final_optimized_geometry: 
       print 'gout.next() =', gout.next() 
       done = gout.next() 
       print 'done =', done 
       p0 = done.split()[0] 
       p2 = done.split()[2] 

#    p0, p2 = done.split()[0:3:2] 

       P0.append(p0) 
       P2.append(p2) 
     elif 'COORDINATES IN THE CRYSTALLOGRAPHIC CELL' in line: 
      if final_optimized_geometry: 
       gout.next() 
       gout.next() 
       while True: 
        line = gout.next() 
        atomdata = line.split() 
        if not atomdata: 
         break 
        if atomdata[1] != 'T': 
         continue 
        atomicnumber = atomdata[2] 
        x, y, z = atomdata[4:7] 
        ATOMIC_NUMBERS.append(atomicnumber) 
        Xs.append(x) 
        Ys.append(y) 
        Zs.append(z) 
       final_optimized_geometry = False 



print 'VOLUMES = ', VOLUMES 
print 'P0 = ', P0 
print 'P2 = ', P2 
print 'Xs = ', Xs 
print 'Ys = ', Ys 
print 'Zs = ', Zs 
print 'ATOMIC_NUMBERS = ', ATOMIC_NUMBERS 

dans laquelle:

1) Parce que la ligne suivante après la dernière atome (10 atome dans cet exemple) est une ligne vide,

    if not atomdata: 
         break 

sera toujours arrêter quand atomdata est vide. En d'autres termes, cela s'arrêtera toujours lorsque la ligne est vide, c'est-à-dire lorsque la liste des atomes est terminée. Par conséquent, cela permettrait d'éviter l'instruction while 'T = ATOM BELONGING TO THE ASYMMETRIC UNIT' not in line:.

Une déclaration similaire serait de dire:

    if atomdata: 
         continue 

Cependant, pour une raison que je ne comprends pas, ce n'est pas capable d'interpréter des lignes non vides comme les seuls à être analized. Pourquoi?

2) Cette partie du code:

   if atomdata[1] != 'T': 
        continue 
       atomicnumber = atomdata[2] 
       x, y, z = atomdata[4:7] 
       ATOMIC_NUMBERS.append(atomicnumber) 
       Xs.append(x) 
       Ys.append(y) 
       Zs.append(z) 

pourrait également être déclaré comme:

   if atomdata[1] == 'T': 
        atomicnumber = atomdata[2] 
        x, y, z = atomdata[4:7] 
        ATOMIC_NUMBERS.append(atomicnumber) 
        Xs.append(x) 
        Ys.append(y) 
        Zs.append(z) 
+1

Si nous rencontrons une ligne avec seulement des espaces (une ligne vide), 'atomdata' sera une liste vide. L'accès à atomdata [1] soulève le 'IndexError', puisque 1 est un index invalide pour une liste vide. Soyez prudent avec votre code, puisque vous lancez un 'break' quand' atomdata' est vide, ce qui signifie que votre analyseur s'arrêtera à la première ligne vide, ce que vous ne vouliez pas (il ne vérifiera que les dix premiers atomes alors). 'Final_optimized_geometry' est un drapeau à retenir si nous sommes à l'intérieur d'un bloc GEOMETRIE FINALE OPTIMISEE ou non. Il est très important de le remettre à False lorsque nous quittons ces blocs. –

+0

@Bart Van Loon Merci beaucoup pour ça :). Je suis totalement d'accord que 'atomdata' est une ligne vide quand on atteint la ligne suivante jusqu'au 10ème atome. Par conséquent, je peux maintenant comprendre l'utilisation de 'if not atomdata: break'. Deux choses: ** 1) ** Notez que vous pouvez aussi utiliser 'if atomdata et atomdata [1]! = 'T':'. ** 2) ** En effet, l'espace après le 10ème atome rompt l'extraction 'atomdata', et est un avantage qui éviterait l'utilisation du marqueur' 'T = ATOM APPARTENANT À L'UNITÉ ASYMÉTRIQUE'' dans votre code. –

+0

@Bart Van Loon S'il vous plaît voir la mise à jour de réponse où je questionne deux types de boucles «si». –