Lecture fichier python + chaine de caractère
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Lecture fichier python + chaine de caractère



  1. #1
    MachineV5

    Lecture fichier python + chaine de caractère


    ------

    Bonjour,

    Dans le cadre d'un projet, je dois utiliser un fichier .txt et coder par la suite des fonctions.
    Cependant, je n'arrive pas à épurer les chaines de caractères de ce dernier et obtenir ce que je veux :

    Voici le fichier .txt
    Capture d’écran 2021-11-24 à 22.57.17.png

    J'aimerai obtenir un dictionnaire de cette forme par la suite :

    Capture d’écran 2021-11-24 à 22.29.11.png

    J'ai utilisé les fonctions classiques :
    Code:
    if __name__ == "__main__":
        zones = [i for i in range(1,25)]
        liste_zones = {}
        with open("zones.txt", "r") as f:
            for line in f:
                point = line.strip(" ").split()
                print(point)
                
                if line in zones:
                    liste_zones[int(line)]=" test"
    Mais je ne vois pas comment faire pour que dès que je rencontre des entiers 1,2,3,..., je les ajoute au dictionnaire jusqu'à ce que je rencontre un autre entier.
    Je ne sais pas si je suis clair ...

    Merci à vous,
    Bonne soirée,
    MachineV5

    -----

  2. #2
    Merlin95

    Re : Lecture fichier python + chaine de caractère

    Tu peux ajouter un test sur les caractères de la ligne pour détecter si c'est un nombre. Pour cela le plus simple est de confronter ta ligne à une expression régulière du type [0;9]* (lignes constituées seulement de chiffres par exemple), afin de traiter ce cas quand il se produit.

  3. #3
    MachineV5

    Re : Lecture fichier python + chaine de caractère

    Merci pour ta réponse !

    Le problème c'est que je ne vois pas comment faire pour que stocker les valeurs des points puis les réinitialiser dès que je passe à une autre zone (1,2,3,..)

  4. #4
    umfred

    Re : Lecture fichier python + chaine de caractère

    tu as 3 types de lignes:
    - ligne vide entre zone: valeur "" et longueur du split = 0 (on pourrait dire qu'on est dans ce cas-là si on n'est pas dans les autres cas)
    - ligne du numéro de la zone: valeur "1" (par exemple) et longueur du split = 1
    - ligne de données de la zone: valeur "1.012 42.66" (par exemple et longueur du split = 2

    A partir de ça, ça va être facile de faire la distinction. Ensuite, comme tu veux un dictionnaire, quand tu vois une valeur de zone tu inities liste_zones[zone]avec une liste vide []
    Ensuite, à la ligne suivante, tu récupères les valeurs en tuple et tu les rajoutes à liste_zones[zone] avec un append
    Dernière modification par umfred ; 25/11/2021 à 15h00.

  5. A voir en vidéo sur Futura
  6. #5
    MachineV5

    Re : Lecture fichier python + chaine de caractère

    Bonjour,

    Merci pour vos différentes réponses.
    J'ai écrit cela et j'ai l'impression que ça marche.

    Cependant quand je veux créer des objets de la classe Point, quand j'essaye de print, je n'ai rien ...

    voici mon code :

    Marche.png

    J'obtiens cela :

    Capture d’écran 2021-11-25 à 16.23.32.jpg

    Quand j'essaye de créer des objets de la classe Point :

    Capture d’écran 2021-11-25 à 16.25.35.png

    J'obtiens :

    Capture d’écran 2021-11-25 à 16.25.22.png

    Ma classe point :

    Capture d’écran 2021-11-25 à 16.26.25.png

  7. #6
    pm42

    Re : Lecture fichier python + chaine de caractère

    Vu que tu l'as déjà fait dans le passé, ce serait bien de poster ton code sous forme de texte entre balises CODE.
    Là, si on a envie de t'aider, il faut cliquer sur 5 images qui ne sont pas immédiatement visibles sur le forum.

  8. #7
    MachineV5

    Re : Lecture fichier python + chaine de caractère

    Excuse moi ! Je pensais qu'elle s'affichait... parfois oui parfois non. Et je n'ai pas ttrouvé comment mettre le code en couleur..

    du coup :
    Code:
    REFERENCE = (1,497691,43.6687731) #longitude/lat de carcasonne
    
    class Point():
        def __init__(self,long,lat):
            self.long = long
            self.lat = lat
            self.r = None
            self.theta = None
            self.convert_to_polar()
    
        def __repr__(self):
            return f'Point(long={self.long}, lat={self.lat})'
    
        
        def convert_to_polar(self):
            long_ref = REFERENCE[0]
            lat_ref = REFERENCE[1]
            self.r = np.sqrt((self.long-long_ref)**2+(self.lat-lat_ref)**2)
            self.theta = m.atan((self.lat - lat_ref)/(self.long - long_ref))


    Code:
    if __name__ == "__main__":
        os.chdir("/Users/Desktop")
        zones = [i for i in range(1,25)]
        liste_zones = {}
        A=[]
        with open("zones 2.txt", "r") as f:
            for line in f:
                line.strip()
                if line == "\n":
                    A=[]
                    continue
                try :
                    if int(line) in zones:
                        liste_zones[int(line)]= A
                except:
                    coord=line.split()
                    print(coord)
                    try:
                        a=str(coord[0])
                        b=str(coord[1])
                        #A.append(Point(a,b))
                        A.append((a,b))
                    except:continue      
            print(liste_zones)
    J'obtiens bien ce que je veux à savoir : Nom : Capture d’écran 2021-11-25 à 16.23.32.jpg
Affichages : 266
Taille : 12,3 Ko

    Mais quand j'utilise :

    Code:
    #A.append(Point(a,b))
    J'obtiens des listes vides ..

  9. #8
    pm42

    Re : Lecture fichier python + chaine de caractère

    Citation Envoyé par MachineV5 Voir le message
    Mais quand j'utilise :

    Code:
    #A.append(Point(a,b))
    Sans doute parce que la création de ton Point échoue avec une exception et que tu fais un try/except:continue qui les ignore sans rien afficher.
    Si tu vires le try:except, tu auras le message d'erreur et tu pourras résoudre.

    Je dis ça à la louche, j'ai lu rapidement mais c'est une 1ère piste.

  10. #9
    umfred

    Re : Lecture fichier python + chaine de caractère

    déjà un problème dans ton REFERENCE il me semble, tel qu'écrit ici, il contient 3 valeurs: 1 , 497691 et 43.6687731; je pense que la 1ère virgule est à changer en point
    Ensuite dans tes calculs de convert_to_polar, tu fais des opérations entre une chaine (self.long/self.lat) et nombre (long_ref et lat_ref) et ça il ne sait pas faire => TypeError

  11. #10
    MachineV5

    Re : Lecture fichier python + chaine de caractère

    Merci bcp ^^', l'erreur bête.

    J'ai réussi à lancer le programme !

    Cependant cela n'affiche pas correctement les points :/

    Capture d’écran 2021-11-26 à 08.51.17.png

    alors que je veux qu'il affiche cela :

    260287313_293417246009989_8973805995523203486_n.jpg.

    Voici le code que j'utilise pour le plot :

    Code:
    def plot_cercle_iter(dictionnaire):
    
        fig = plt.figure()
        ax = fig.add_subplot(111, projection='polar')
        ax.set_xticks(np.arange(0,2.0*np.pi,np.pi/6.0))
        ax.set_theta_zero_location("N")
        ax.set_theta_direction(-1)
        ax.set_ylim(0,4) 
        ax.set_yticks(np.arange(0,4,1.0))
    
        for zone in dictionnaire.items():
            liste_theta = []
            liste_r = []
    
            for points_zone in zone[1]:
                r = points_zone.r
                theta = np.deg2rad(points_zone.theta)
                liste_theta.append(theta)
                liste_r.append(r)
                ax.scatter(theta,r,color="red")
                ax.plot([theta,theta],[0,r])
    
            plt.fill(liste_theta,liste_r,'r') 
    
        plt.show()
    Je pense que mon erreur provient de cette méthode:

    Code:
        def convert_to_polar(self):
            long_ref = REFERENCE[0]
            lat_ref = REFERENCE[1]
            self.r = np.sqrt((float(self.long)-long_ref)**2+(float(self.lat)-lat_ref)**2)
            self.theta = m.atan((float(self.lat) - lat_ref)/(float(self.long) - long_ref))

  12. #11
    umfred

    Re : Lecture fichier python + chaine de caractère

    tes 2 captures n'ont vraiment rien à voir. sur la 1ere on a un matplotlib affichage coordonnées circulaire; sur la 2nde, une carte avec des zones détourées.
    ce que tu cherches à faire, c'est un changement de système de coordonnées si j'ai bien compris ?
    les coordonnées GPS sont définies par rapport au centre de la Terre et aux lignes 0° que sont l'équateur (N/S) et le méridien de Greenwich (E/W)
    et tu cherches à les définir par rapport à un point du globe; il faut donc transformer la coordonnée du point de ses coordonnées GPS à une coordonnée (0,0); et appliquer la même transformation à l'autre point GPS

  13. #12
    MachineV5

    Re : Lecture fichier python + chaine de caractère

    Oui c'est ça !
    J'aimerais représenter la carte en matplotlib avec les zones interdites.
    Après ne peut-on pas dire que localement la Terre est plate ?
    Je voudrais que le centre de mon plot soit l'aérodrome (ma référence) et tracer ces zones à partir de cela en trouvant un rayon et un angle (r et theta)

  14. #13
    umfred

    Re : Lecture fichier python + chaine de caractère

    Pour moi, pas besoin de faire de calcul dans ce cas, et pas besoin de coordonnées polaires, une simple soustraction des coordonnées doit suffire pour avoir les coordonnées par rapport à ton centre. et à partir de ces coordonnées et en sachant qu'un 1° long = 78.847 km et 1° lat = 111.133 km (à 45° de latitude ), tu pourrais faire ton calcul je pense.
    https://en.wikipedia.org/wiki/Longit...e_of_longitude

  15. #14
    MachineV5

    Re : Lecture fichier python + chaine de caractère

    Je voulais passer par des coordonnées polaires pour afficher cela sur un cercle.
    On va devoir faire pas mal de calculs avec ces zones (qui représentent en fait les zones interdites d'installation de panneaux solaires) et les modéliser par des rayons et des angles me paraissaient pertinents.

    Les zones vides sont les potentiels endroits où nous installerons les panneaux solaires. Un calcul d'ensoleillement, de densité et une optimisation d'une certaine fonction objectif nous permettront de les choisir
    Dernière modification par MachineV5 ; 26/11/2021 à 12h09.

  16. #15
    oxycryo

    Re : Lecture fichier python + chaine de caractère

    salut m'a petite solution
    ayant déjà été obligé de produire le txt source, je ne m'nerve pas sur l'import fichier, un module casuel étant de bon gout. (plus de deux lignes pour une instruction étant un pécher mortel )

    Code:
    zzz='''
    1
    1.2123 12.4152
    1.2123 12.4152
    1.2123 12.4152
    1.2123 12.4152
    
    2
    2.2123 12.4152
    2.2123 12.4152
    2.2123 12.4152
    2.2123 12.4152
    
    3
    3.2123 12.4152
    3.2123 12.4152
    3.2123 12.4152
    3.2123 12.4152
    '''
    
    aa=zzz.split('\n')
    
    L0=["",[]] #= forme importante por une lecture séquentielle, permet l'ajout elm par elm dans chaque index à la volée
    L1=[]       #= liste transitoire
    L2=[]
    # d'abord agréger les données sous forme de tableau de list
    for x,lig in enumerate(aa):
        if x>0:
            if len(lig)==1:
                L0[0]+="%s"%lig
    
            if len(lig)>1:
                L1+=[tuple(map(float,lig.split(" ")))]
    
            if len(lig)==0 or x==len(aa)-1:
                L0[1]+=L1;L1=[]
                L2+=[L0];L0=["",[]]
    
    zz=dict(L2) #) passe le tableau de list en dico de list. 
    
    >>> {'1': [(1.2123, 12.4152), (1.2123, 12.4152), (1.2123, 12.4152), (1.2123, 12.4152)], '2': [(2.2123, 12.4152), (2.2123, 12.4152), (2.2123, 12.4152), (2.2123, 12.4152)], '3': [(3.2123, 12.4152), (3.2123, 12.4152), (3.2123, 12.4152), (3.2123, 12.4152)]}
    tu remercieras ton prof pour ce petit cass- tête de derrière les fagots, n'utilisant jamais ces conneries de dict/hash inapte a quoique ce soit, ça m'a permit de me satisfaire(grandement) de ne m'y être jamais interressé
    libera me : ungoogled chromium, e.foundation (anti-droid)

  17. #16
    pm42

    Re : Lecture fichier python + chaine de caractère

    Citation Envoyé par oxycryo Voir le message
    n'utilisant jamais ces conneries de dict/hash inapte a quoique ce soit, ça m'a permit de me satisfaire(grandement) de ne m'y être jamais interressé
    On pourra ignorer ce genre de message qui traduit uniquement l'ignorance et l'incompétence totale de son auteur.

  18. #17
    oxycryo

    Re : Lecture fichier python + chaine de caractère

    comment dire PM42, quand on utilise pas les tableau de liste correctement on est contraint d'utiliser cette vieille baderne de dict... je me demande ou se trouve l'incompétence... les listes pythons sont plus rapide, et surtout extensible et ordonée, là où les dict, sont restreint en fonctionnalité...

    tu ne dois pas coder souvent, pour ne t'en être jamais rendue compte

  19. #18
    umfred

    Re : Lecture fichier python + chaine de caractère

    chacun a son utilité et peuvent être complémentaire; les listes ne sont pas ordonnées, mais ordonnables; les dictionnaires ne nécessitent pas d'être ordonnés puisqu'on y accède par mot clé et sont aussi extensibles (on peut rajouter des entrées).

    @Machine: rien n'empêche de faire des cercles dans un repère cartésien (une carte en général c'est en cartésien, même si on y affiche les coordonnées gps qui eux sont par rapport au centre de la Terre (donc localement, on peut considérer que c'est plat)

  20. #19
    pm42

    Re : Lecture fichier python + chaine de caractère

    Citation Envoyé par umfred Voir le message
    chacun a son utilité et peuvent être complémentaire; les listes ne sont pas ordonnées, mais ordonnables; les dictionnaires ne nécessitent pas d'être ordonnés puisqu'on y accède par mot clé et sont aussi extensibles (on peut rajouter des entrées).
    On peut également préciser que la recherche est en temps constant et pas en n comme pour les listes ce qui rend l'argument "les listes sont plus rapides" totalement ridicule.
    Et que si on veut garder un ordre sur les clés, il y a des SortedDict qui eux sont en général en log(n).
    Pour ce qui est de garder l'ordre d'insertion, c'est également ce que font les Dict en Python depuis la version 3.6 (voir par exemple https://stackoverflow.com/questions/...er-as-declared)

Discussions similaires

  1. Intégrer caractère entre les caractères d'une chaîne - PYTHON
    Par Chalael dans le forum Programmation et langages, Algorithmique
    Réponses: 12
    Dernier message: 22/06/2016, 06h36
  2. Remplacer une chaîne de caractère par une constante entier dans un fichier.
    Par Anna-prog dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 06/06/2013, 09h02
  3. Python, remplacement d'une chaine de caractère
    Par berguem40 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 12/09/2011, 16h24
  4. lecture fichier Python
    Par berguem40 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 09/09/2011, 11h25
  5. probleme lecture et longueur de fichier sur python
    Par fitzounet dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 09/11/2010, 08h22