Partage
  • Partager sur Facebook
  • Partager sur Twitter

recuperation des données et stockage

recuperer des données d'un fichier .dxf et les stoquer dans une liste

6 février 2019 à 17:49:50

Bonjour,

je vous prie de me corriger mon programme ou me proposer une autre solution SVP;

j'aimerais lire un fichier .dxf suivant ,puis  récupérer et afficher les coordonnées de tous les points de la géométrie polyline.

CIRCLE
8 Undeflected 
10
0.5
20
Polyline
 10			#référence de la coordonnée x du point 1
-34.68044809800129	#la valeur de la coordonnée x du point 1
 20			#référence de la coordonnée y du point 1
-1.29110251450677	#la valeur de la coordonnée y du point 1
 10			#référence de la coordonnée x du point 2
-27.93802385557705	#la valeur de la coordonnée x du point 2
 20			#référence de la coordonnée y du point 2
10.47227595099936	#la valeur de la coordonnée y du point 2
 10
-16.82019664732431
 20
3.156028368794326
 10
-9.503949065119278
  0
EOF

j'ai essayé avec le programme suivant de récupérer tous les coordonnées et les stocker dans une liste,mais j'ai arrive à afficher que la dernière valeur, les autres sont écrasées.

my_list = []
geometry= ['CIRCLE','LINE','Polyline','EOF']
maGeom = "none"
with open("my_file.dxf", "r") as fichier:
	for ligne in fichier:
#si ya une geometrie dans une ligne du fichier on va l'affecter a maGeom
		if ligne[:-1] in geometry:
			maGeom = ligne[:-1]
#si maGeom est Polyline donc on affiche Polyline et lire les lignes suivantes tant qu'on trouve pas une autre geometrie et stocker ces données dans une liste 

		if maGeom == 'Polyline':	
				print 'Polyline'
				ligne=next(fichier)
				while ligne[:-1] not in geometry:
					if '10' in ligne[:-1]:
						x_valeur = [next(fichier)  for x in xrange(1)]
						my_list = [x_valeur]
						#print my_list
					if '20' in ligne[:-1]:
						y_valeur = [next(fichier) for x in xrange(1)]
						my_list = [y_valeur]
						#print my_list
					ligne=next(fichier)
				print my_list
				maGeom = ligne[:-1]	


je vous remercie pour votre aide

  • Partager sur Facebook
  • Partager sur Twitter
6 février 2019 à 20:53:29

- pourquoi for x in xrange(1) ?

- pourquoi python2 plutôt que python3 ?

- utilise float(text) pour convertir une chaîne en nombre. à ce propos les commentaires sont-ils dans le fichier réel ? si oui tu peux faire:

if "#" in ligne:
    ligne = ligne.split("#")[0]
valeur = float(ligne)


-utilise ligne.strip() plutôt que ligne[:-1]

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 12:54:44

Bonjour,

merci thelinekioubeur pour votre attention

J'ai utilisé la boucle for x in xrange(1) pour lire la ligne suivante à celle qui porte 10 ou 20, et les nombres 10 et 20  sont  juste des indices des coordonnées X et Y dans l'ordre, mais leurs valeurs c'est les lignes qui  suivent ces indices.

j'utilise python 2 car je dois utiliser ce code sur le logiciel Abaqus qui accepte que python 2.7

Les commentaire sur le fichier .dxf (le premier fichier) sont là juste pour l’explication.

-
Edité par SofianeToumi 11 février 2019 à 13:01:39

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 14:16:06

Bonjour,

Voilà ce que je propose,

import re

START = 'Polyline'
END = ('EOF', '0')
PATTERN = "[-+]?\d*\.\d+|\d+"

x = [] # list of ccords x
y = [] # list of coords y


def add_value(cat):
	line = next(f).rstrip('\n').strip()
	n = re.search(PATTERN, line).group(0)
	if cat == '10':
		x.append(n)
	else:
		y.append(n)


with open("my_file.dxf", 'r') as f:
	while True:
		line = next(f).rstrip('\n').strip() # ignore lines before Polyline
		if line == START:
			break
	
	while True:
		line = next(f).rstrip('\n').strip()
		if line in END: # check end of file
			break
		n = re.search(PATTERN, line).group(0)
		add_value(n) # add values in x and y for category n

for a, b in zip(x, y):
	print((a, b)) # display coords

Pour conclure,

  • fichier incomplet (voir ci-dessous)
  • fichier mal formé (par exemple ligne 21, je devrais avoir un 20 et non un 0)
  • difficile de faire quelque chose de propre avec un exemple aussi pourri (il manque une ligne entre 21 et 22)

Merci d'être plus précis dans les contraintes, prendre le temps d'envoyer un texte bien formé et résolvable afin d'éviter les retouches nous même... de la rigueur quoi !

-
Edité par fred1599 11 février 2019 à 14:17:03

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

11 février 2019 à 15:00:47

ça marche super bien, je vous remercie pour votre aide, je suis vraiment désolé pour les erreurs sur le fichier, je prendrai en compte de vos remarques dans le future.

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 15:21:16

De rien, cependant il reste à le comprendre avec les notions suivantes,

  • Les générateurs
  • Les expressions régulières

Pour ce dernier ça reste un gros pavé à digérer.

Les générateurs c'est moins long, mais particulier, je ne vois pas beaucoup de débutants qui les utilisent.

Toutes ces documentations se trouvent sur le net et en français, je te laisse chercher tranquillement.

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

12 février 2019 à 18:14:38

Merci pour vos conseilles,

je suis obligé de le comprendre de toutes façon car je dois le modifier pour l'intégrer dans mon programme principale.

  • Partager sur Facebook
  • Partager sur Twitter