IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Modifier la mise en forme d'une liste de coordonnées


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Géotechnique et Génie-Civil
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Etudiant en Géotechnique et Génie-Civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Par défaut Modifier la mise en forme d'une liste de coordonnées
    Bonjour,

    j'ai un fichier.txt contenant environ 4500 cordonnées {x, y} et je souhaiterais modifier la mise en forme pour pouvoir utiliser les données dans un script en .js

    Je m'explique :

    - le fichier.txt contient des coordonnées sur une seule ligne sous la forme :

    (obtenu avec wolfram mat)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListLinePlot[{{-8.,-105.},{-7.5,-105.},{-7.,-105.},{-6.,-104.5},{-6.5,-105.},{-6.,-104.}, ...........,{-8.,-105.}},options]
    - je souhaiterais savoir comment procéder pour obtenir le fichier de coordonnées sous la forme :

    (exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let drawing = [
      { x: -75.23920093800275, y: -9.276916512631997 },
      { x: -73.99534065831229, y: -9.582732689485699 },
      { x: -72.74106439694725, y: -9.89162195029445 },
      { x: 89.098690447214615, y: -30.1270624035567 },
       .............
      { x: 88.098690447214615, y: -30.1270624035567 },
      { x: 87.098690447214615, y: -30.1270624035567 },
      { x: 86.098690447214615, y: -30.1270624035567 },
      { x: 85.098690447214615, y: -30.1270624035567 },
    ];
    Si quelqu'un peut m'expliquer comment éditer ce fichier ce serait super

    Merci,
    bonne journée

    poutreBA

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    La lecture d'un fichier retourne du texte, il faut donc nettoyer ce qui est inutile et convertir les données en réels.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    with open("coords.txt", "r") as inf:
        line = inf.read()
     
    line = line.replace("ListLinePlot[{{", "").replace("}},options]", "")\
               .rstrip().split("},{")
     
    coords = [c.split(",") for c in line]
    drawings_coords = [{"x": float(i[0]), "y": float(i[1])} for i in coords]
     
    print(drawings_coords)
    Ici on part du part du principe que le fichier ne contient qu'une seule ligne, si ce n'est pas le cas, tu devras rajouter du code.

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonsoir,

    En partant d'une ligne, voir peut-être même de plusieurs (à tester), on pourrait utiliser les expressions régulières.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import re
     
    s = """ListLinePlot[{{-8.,-105.},{-7.5,-105.},{-7.,-105.},{-6.,-104.5},{-6.5,-105.},{-6.,-104.},{-8.,-105.}},options]"""
    pattern = "-?\d*\.{0,1}\d+"
     
    result = []
    coord = re.findall(pattern, s)
    for i in range(0, len(coord), 2):
        d = {'x': float(coord[i]), 'y': float(coord[i + 1])}
        result.append(d)
     
    print(result)  # [{'x': -8.0, 'y': -105.0}, {'x': -7.5, 'y': -105.0}, {'x': -7.0, 'y': -105.0}, {'x': -6.0, 'y': -104.5}, {'x': -6.5, 'y': -105.0}, {'x': -6.0, 'y': -104.0}, {'x': -8.0, 'y': -105.0}]
    Ce qui fait en plus raccourci,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re
     
    s = """ListLinePlot[{{-8.,-105.},{-7.5,-105.},{-7.,-105.},{-6.,-104.5},{-6.5,-105.},{-6.,-104.},{-8.,-105.}},options]"""
    pattern = "-?\d*\.{0,1}\d+"
     
    coord = re.findall(pattern, s)
    result = [{'x': float(coord[i]), 'y': float(coord[i + 1])} for i in range(0, len(coord), 2)]
    print(result)
    à voir si le formatage du texte est correct, et tous les imprévus qui pourraient arriver et que je ne connais pas.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Géotechnique et Génie-Civil
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Etudiant en Géotechnique et Génie-Civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Par défaut
    Merci pour vos réponses, après avoir essayé les deux solutions j'obtiens un résultat sur une seule ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{'x': -8.0, 'y': -105.0}, {'x': -7.5, 'y': -105.0}, {'x': -7.0, 'y': -105.0}, {'x': -6.0, 'y': -104.5}, {'x': -6.5, 'y': -105.0}, {'x': -6.0, 'y': -104.0}, {'x': -8.0, 'y': -105.0}]
    or je voudrais l'obtenir sous une forme segmentée avec 1 jeu de coordonnées par ligne, avec chaque ligne se terminant par " ; " et x et y comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [{x: -8.0, y: -105.0}; 
    {x: -7.5, y: -105.0}; 
    {x: -7.0, y: -105.0}; 
    {x: -6.0, y: -104.5}; 
    {x: -6.5, y: -105.0}; 
    {x: -6.0, y: -104.0}; 
    {x: -8.0, y: -105.0}]
    si vous voyez comment faire svp

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par poutreBA Voir le message
    or je voudrais l'obtenir sous une forme segmentée avec 1 jeu de coordonnées par ligne, avec chaque ligne se terminant par " ; " et x et y comme ceci :
    si vous voyez comment faire svp
    Sauf méconnaissance de ma part ce n'est pas possible car une liste à la format [objet1,objet2,objet3] et non [objet1;objet2;objet3]. Sauf si tu veux juste du texte... Dans ce cas tu peux faire rajouter ça à mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>>for o in n:
    	print(o,";")
     
    {'x': -8.0, 'y': -105.0} ;
    {'x': -7.5, 'y': -105.0} ;
    {'x': -7.0, 'y': -105.0} ;
    {'x': -6.0, 'y': -104.5} ;
    {'x': -6.5, 'y': -105.0} ;
    {'x': -6.0, 'y': -104.0} ;
    {'x': -8.0, 'y': -105.0} ;
    Oops j'avais oublié les float dans mon code précédent !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Géotechnique et Génie-Civil
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Etudiant en Géotechnique et Génie-Civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Par défaut
    Merci LeNarvalo, j'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with open("ListLinePlotfourier.txt", "r") as inf:
        line = inf.read()
     
    line = line.replace("ListLinePlot[{{", "").replace("}},options]", "")\
               .rstrip().split("},{")
     
    coords = [c.split(",") for c in line]
    drawings_coords = [{"x": float(i[0]), "y": float(i[1])} for i in coords]
     
    for o in drawings_coords:
        print(o,";")
    et ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from re import findall
    l =" ListLinePlot[{{-8.,-105.},{-7.5,-105.},{-7.,-105.},{-6.,-104.5},{-6.5,-105.},{-6.,-104.}{-8.,-105.}},options]"
    m = findall("[+-]?\d+(?:\.\d+)?",l)
    n = [{"x":float(x),"y":float(y)} for x,y in [[m[i],m[i+1]] for i in range(0,len(m),2)]]
     
    for o in n:
    	print(o,";")
    Le résultat est en bonne mise en forme (à part le " 'x': " au lieu de "x:") mais incomplet et dans le désordre (car il y a environ 4500 jeux de coordonnées dans le fichier .txt)

    Dans l'idéal je cherche à avoir juste du texte avec la mise en forme montrée plus haut,

    merci de vos réponses

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par poutreBA Voir le message
    Merci pour vos réponses, après avoir essayé les deux solutions j'obtiens un résultat sur une seule ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{'x': -8.0, 'y': -105.0}, {'x': -7.5, 'y': -105.0}, {'x': -7.0, 'y': -105.0}, {'x': -6.0, 'y': -104.5}, {'x': -6.5, 'y': -105.0}, {'x': -6.0, 'y': -104.0}, {'x': -8.0, 'y': -105.0}]
    or je voudrais l'obtenir sous une forme segmentée avec 1 jeu de coordonnées par ligne, avec chaque ligne se terminant par " ; " et x et y comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [{x: -8.0, y: -105.0}; 
    {x: -7.5, y: -105.0}; 
    {x: -7.0, y: -105.0}; 
    {x: -6.0, y: -104.5}; 
    {x: -6.5, y: -105.0}; 
    {x: -6.0, y: -104.0}; 
    {x: -8.0, y: -105.0}]
    si vous voyez comment faire svp
    La question est : Pourquoi spécifiquement cette mise en forme et surtout quelle difficulté rencontrée pour le faire ?
    Une mise en forme telle que vous présentez, donne l'impression que vous souhaitez un objet list, ce qui est impossible à représenter de cette manière, en tant qu'objet.
    Si c'est dans le formatage de chaîne, il n'y a pas de problème, et dans ce cas là ma réponse comme celle des mes VDD suffit pour être utiliser et pour être adapter dans un formatage spécifique.

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Citation Envoyé par poutreBA Voir le message
    Merci pour vos réponses, après avoir essayé les deux solutions j'obtiens un résultat sur une seule ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{'x': -8.0, 'y': -105.0}, {'x': -7.5, 'y': -105.0}, {'x': -7.0, 'y': -105.0}, {'x': -6.0, 'y': -104.5}, {'x': -6.5, 'y': -105.0}, {'x': -6.0, 'y': -104.0}, {'x': -8.0, 'y': -105.0}]
    or je voudrais l'obtenir sous une forme segmentée avec 1 jeu de coordonnées par ligne, avec chaque ligne se terminant par " ; " et x et y comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [{x: -8.0, y: -105.0}; 
    {x: -7.5, y: -105.0}; 
    {x: -7.0, y: -105.0}; 
    {x: -6.0, y: -104.5}; 
    {x: -6.5, y: -105.0}; 
    {x: -6.0, y: -104.0}; 
    {x: -8.0, y: -105.0}]
    si vous voyez comment faire svp

    Pour obtenir un tel résultat, il faut convertir la liste en chaine de caractères multilignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    L = [{'x': -8.0, 'y': -105.0}, {'x': -7.5, 'y': -105.0}, {'x': -7.0, 'y': -105.0}, {'x': -6.0, 'y': -104.5}, {'x': -6.5, 'y': -105.0}, {'x': -6.0, 'y': -104.0}, {'x': -8.0, 'y': -105.0}]
     
    ch = ""
    for i, elem in enumerate(L):
        ligne = str(elem)+';'
        if i==0:
            ligne = '['+ligne
        elif i==len(L)-1:
            ligne = ligne[:-1] + ']'
        ch += ligne.replace("'", '')+'\n'       
     
    print(ch)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [{x: -8.0, y: -105.0};
    {x: -7.5, y: -105.0};
    {x: -7.0, y: -105.0};
    {x: -6.0, y: -104.5};
    {x: -6.5, y: -105.0};
    {x: -6.0, y: -104.0};
    {x: -8.0, y: -105.0}]

  9. #9
    Invité
    Invité(e)
    Par défaut
    Encore plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from re import findall
    l =" ListLinePlot[{{-8.,-105.},{-7.5,-105.},{-7.,-105.},{-6.,-104.5},{-6.5,-105.},{-6.,-104.}{-8.,-105.}},options]"
    m = findall("[+-]?\d+(?:\.\d+)?",l)
    n = [{"x":float(x),"y":float(y)} for x,y in [[m[i],m[i+1]] for i in range(0,len(m),2)]]
    Dernière modification par Invité ; 05/09/2020 à 12h41.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Géotechnique et Génie-Civil
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Etudiant en Géotechnique et Génie-Civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Encore plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from re import findall
    l =" ListLinePlot[{{-8.,-105.},{-7.5,-105.},{-7.,-105.},{-6.,-104.5},{-6.5,-105.},{-6.,-104.}{-8.,-105.}},options]"
    m = findall("[+-]?\d+(?:\.\d+)?",l)
    n = [{"x":x,"y":y} for x,y in [[m[i],m[i+1]] for i in range(0,len(m),2)]]
    merci pour ta réponse mais ça ne correspond pas tout à fait à la mise en forme que je recherchais comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [{x: -8.0, y: -105.0}; 
    {x: -7.5, y: -105.0}; 
    {x: -7.0, y: -105.0}; 
    {x: -6.0, y: -104.5}; 
    {x: -6.5, y: -105.0}; 
    {x: -6.0, y: -104.0}; 
    {x: -8.0, y: -105.0}]

Discussions similaires

  1. Mise en forme d'une liste
    Par Olivier Regnier dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 01/10/2007, 17h44
  2. Problème de mise en forme dans une liste personnalisée
    Par smarties dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 17/01/2007, 15h47
  3. Réponses: 5
    Dernier message: 02/01/2007, 15h19
  4. Pb de mise en forme dans une liste de selection
    Par crashyear dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/09/2006, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo