1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| with open('piktux.txt', 'r') as f:
ch = f.read()
import re
patSpool = re.compile('/SPOOL\r?\nSPOOL-ID\s+(\d+)\r?\nSPOOL-PREFIX\s+(.+?)\r?\n'
'(.+?)/END-SPOOL',re.DOTALL)
agarder = ('^ND {23}', '^OD {23}', '^WALL-THICKNESS {11}',
'^START {9}','^BEND[\d ]{10}','^FINISH {8}')
# dans agarder: en-têtes précis des lignes à garder
patLigne = re.compile( '(' + '|'.join( ag+'.+\n' for ag in agarder ) + ')',re.MULTILINE )
for id,prefix,portion in (m.groups() for m in patSpool.finditer(ch)):
# on crée le nom du fichier qui va recevoir le contenu de cette portion
out_name = id + '^' + prefix + '.txt'
# on crée la sélection de lignes de cette portion qui va être enregistrée
chout = ''
for line in ( m.group() for m in patLigne.finditer(portion)):
if line[0:5] == 'START': # ligne START
L = [line[14:].split()] # on met les nombres dans une liste L recréée
chout += line # et on enregistre la ligne START dans chout
elif line[0:4] == 'BEND': # lignes BEND quand il y en a
L.append(line[14:].split()) # on ajoute seulement la ligne à L
elif line[0:6]=='FINISH': # ligne FINISH
# on va faire les calculs sur les lignes BEND et FINISH avant d'enregistrer
L.append(line[14:].split()) # ajout nécessaire de la denière ligne à L
for i in xrange(1,len(L)-1): # calculs et enregistrement dans chout des lignes BEND
li = [str(float(L[i][k])-float(L[i-1][k])) for k in xrange(5)]
chout += ('BEND' + str(i)).ljust(14)\
+ ''.join(x.rjust(9) for x in li) + '\n'
chout += 'FINISH ' + ''.join(x.rjust(9) for x in L[-1]) + '\n' # ajout de FINISH
else:
chout += line # on enregistre les lignes ND, OD, WALL-THICKNESS
# on enregistre la portion traitée dans un fichier de nom out_name
with open(out_name, 'w') as g:
g.write(chout) |
Partager