Lire un fichier prn avec python [Résolu]

Signaler
Messages postés
29
Date d'inscription
mercredi 6 décembre 2017
Statut
Membre
Dernière intervention
9 octobre 2020
-
Messages postés
29
Date d'inscription
mercredi 6 décembre 2017
Statut
Membre
Dernière intervention
9 octobre 2020
-
Bonjour,

J'ai un fichier que j'obtiens depuis un programme qui est au format "prn". Je souhaiterai pouvoir lire ce fichier avec python pour ensuite pouvoir récupérer certaines information (exemple: un point avec ses coordonnées) pour finalement mettre ces informations dans une base de données SQlite.

Mon problème c'est que je bloque déjà à la première étape et que je n'arrive pas à lire mon fichier "prn".

Est-ce que quelqu'un saurait comment je peux faire ça?

8 réponses

Messages postés
29819
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 octobre 2020
6 841
Bonjour,

Juste quelques observations. Ton fichier .PRN il contient juste du texte, donc lisible par un éditeur ou c'est plutôt du binaire avec les séquences PostScript destinées à l'imprimante pour le formatage de l'état ?
Car dans le 1er cas, les bibliothèques pour fichier texte de python devrait suffire, après à toi de de localiser les données que tu cherches dans les enregistrements.

Dans le second, il faudrait une bibliothèque spécialisée. Et si on semble en trouver comme : https://pypi.org/project/cutplace/ je pense que c'est juste destiné à un fichier texte formaté.


Messages postés
29
Date d'inscription
mercredi 6 décembre 2017
Statut
Membre
Dernière intervention
9 octobre 2020

Alors il s'agit uniquement du premier choix.
J'ai du texte et des nombres donc normalement facilement lisible par python mais quand je l'ouvre il me dit que ".prn" il ne reconnait pas
Messages postés
29819
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 octobre 2020
6 841
et en tout simplement renommant avant le fichier en .txt
Messages postés
29
Date d'inscription
mercredi 6 décembre 2017
Statut
Membre
Dernière intervention
9 octobre 2020

Ok ça fonctionne super bien merci.

Maintenant j'ai un autre soucis :
dans ce fichier texte j'aimerais en récupérer seulement une partie et créer un tableau à partie de ce texte. Mon texte se comporte comme dans l'exemple ci-dessous :
        63319034      V  592.6382
        -------------------------
   122  63300011      V   -1.244            0.   3.6  36.    31  0.2          24.062  -3.2869         0.000  0.000 0                 
   123  63300008      V   -1.313           -2.   4.6  54.    32 -0.6          72.271  -1.1564         0.000  0.000 0                 
   124  63300012      V   -1.318            0.   4.6   0. INFINI  INDETERM    72.271  -1.1608         0.000  0.000 0                 
   125  63300013      V   -0.913            0.   3.6   0. INFINI  INDETERM    11.366  -5.1000         0.000  0.000 0                 
   126  63300014      V   -0.750            0.   3.7   0. INFINI  INDETERM    32.834  -1.4543         0.000  0.000 0                 
   127  63300015      V   -1.430            0.   3.8  28.    37 -0.1          38.171  -2.3838         0.000  0.000 0                 

        63429005      V  592.1965
        -------------------------
   128  V17901009          0.428            2.   3.8  76.    23  0.5          39.389   0.6914         0.000  0.000 0                 
   129  V17901006         -0.148            2.   3.6  72.    22  0.8          20.630  -0.4570         0.000  0.000 0                 
   130  V17901008         -0.334           -7.   4.2  80.    24 -1.8          56.743  -0.3750         0.000  0.000 0                 
   131  V17901003          0.057            1.   4.2  80.    24  0.3          56.748   0.0642         0.000  0.000 0                 
   132  63400008      V   -0.066      0.    0.   3.5  50.    26 -0.1          62.812  -0.0671         0.000  0.000 0                 
   133                     0.066            0.   3.5  50.    26 -0.1          62.812   0.0670         0.000  0.000 0                 
   134  63300015      V   -0.989            0.   4.1  33.    37  0.1          54.943  -1.1459         0.000  0.000 0                 

        63400008      V  592.1304
        -------------------------
   135  63400013      V   -0.406            0.   3.7   0. INFINI  INDETERM    32.948  -0.7849         0.000  0.000 0                 

        63429011      V  592.0724
        -------------------------
   136  V17925002         -0.695           -2.   3.6  67.    23 -0.6          23.828  -1.8554         0.000  0.000 0                 
   137  V17925004         -0.978            1.   6.3  89.    34  0.1         128.795  -0.4840         0.000  0.000 0                 
   138  V17901010         -0.136            0.   3.9  72.    24  0.1          43.462  -0.1993         0.000  0.000 0                 
   139  63300001      V   -1.038            1.   3.7  49.    27  0.2          27.383  -2.4115         0.000  0.000 0                 
   140  63300002      V   -0.972            1.   4.5  58.    30  0.2          70.266  -0.8807         0.000  0.000 0                 
   141  63300003      V   -0.693            0.   4.8  53.    34  0.1          81.168  -0.5438         0.000  0.000 0                 

  STATISTIQUE                                                                                                                        
  ***********                                                                                                                        
     6 WI    >       3.5,          VALEUR MAXIMUM INDET SUR OBSERVATION NUMERO   116                                                 
                                                                                                                                     
  LIMITE DETECT.D'ERREURS:    5.1, ERREUR 2E TYPE   5.0 %                                                                            
  sigeom sa                    TITRE: 00634_calc Calcul PFP3 complémentaire                LE 30.04.2020 14:04
  PROGR. DE TRIANGULATION LTOP VERS.: 2011.1.3 - PC(LF-8000)            OPT: MENS. PTS FIXES 4.ORD.  PAGE    2
  ------------------------------------------------------------------------------------------------------------
  COORD. ET  ALT. ,PTS VARIABLES  AVEC  ACCROISSEMENTS  ET  ELLIPSES  D' ERREUR MOYENNES     PAYS : CH
  **************************************************************************************
  POINT    TYPE        Y           X         H         DY      DX      DH     EMA   EMB   GISA    EMH  ELEM.MES.
                       M           M         M         MM      MM      MM     MM    MM      G     MM  PLAN. ALT.
  NULLBERN      2600000.000 1200000.000     0.000                                                        0    0
  V54310891     2585612.490 1226061.961   592.047                                                        0    0
  V54310899     2585555.689 1226044.755   591.889                                                        0    0
  V17925004     2585600.374 1226008.447   591.095                                                        4    2
  V17901010     2585553.571 1225936.862   591.937                                                        4    2
  V47269014     2585571.217 1225929.044   590.547                                                        2    1
  63319031      2585548.362 1225921.639   592.103      0.7    -0.7   -0.7     0.6   0.6  -79.7    0.8   16    8
  63319032      2585507.662 1225848.093   592.106      3.1    -1.1   -0.3     1.3   0.9  -73.7    1.1   22   11
  63300001      2585514.154 1225879.283   591.035      2.4    -0.9   -0.5     1.1   1.0  -60.4    1.3    6    3
  63300002      2585494.036 1225840.294   591.101      2.9    -1.7   -0.5     1.4   1.0  -64.9    1.4    6    3
  63300003      2585501.138 1225823.828   591.380      3.3    -1.3   -0.5     1.7   1.2  -74.1    1.6    4    2
  63319033      2585453.128 1225759.198   591.844      6.1    -2.4   -0.1     3.1   1.1  -69.4    1.4   24   12
  63300004      2585473.964 1225801.190   591.219      5.4    -2.0   -0.1     2.3   1.4  -68.2    1.8    4    2
  63300005      2585457.843 1225770.403   591.602      5.8    -2.4   -0.2     3.0   1.4  -68.3    1.8    4    2
  63300006      2585460.499 1225743.679   592.554      6.2    -2.8   -0.5     3.4   1.4  -74.8    1.9    4    2
  63300009      2585484.842 1225744.568   592.925      6.3    -2.2   -0.2     3.5   1.7  -86.8    2.2    2    1
  63300010      2585503.340 1225762.672   591.331      6.1    -2.2    0.0     3.1   1.8  -95.5    2.3    2    1
  63300007      2585498.273 1225789.909   591.298      5.3    -1.7   -0.1     2.4   1.4  -86.0    1.8    4    2
  63319034      2585462.558 1225842.649   592.638      8.4    -3.5   -0.2     1.8   1.4  -46.4    1.6   16    8
  63300011      2585463.098 1225818.593   591.395      6.9    -3.1    0.0     2.2   1.5  -55.7    1.9    4    2
  63300008      2585457.487 1225770.556   591.324      6.0    -2.8    0.6     3.1   1.5  -70.4    1.9    4    2
  63300012      2585457.489 1225770.556   591.321      6.6    -3.4   -0.2     3.4   1.9  -73.1    2.6    2    1
  63300013      2585473.353 1225846.207   591.726      8.5    -3.7   -0.1     2.1   1.9  -70.2    2.3    2    1
  63300014      2585457.076 1225810.276   591.888      7.6    -3.4   -0.1     2.6   1.9  -54.5    2.3    2    1
  63300015      2585483.177 1225874.772   591.208     10.8    -5.1   -0.5     1.6   1.3  -86.7    1.6    4    2
  V55580209     2585618.945 1226144.049   592.098                                                        0    0
  44810007      2585638.778 1226214.746   592.127                                                        0    0
  V56375004     2585642.490 1226204.652   594.054                                                        0    0
  V55580207     2585608.012 1226098.425   592.986                                                        0    0
  44810508      2585610.485 1226135.258   592.310                                                        0    0
  V54310895     2585595.740 1226067.679   592.132                                                        0    0
  V54310897     2585590.899 1226064.707   591.925                                                        0    0
  V17901001     2585525.015 1226008.855   591.475                                                        0    0
  V17901003     2585511.303 1225981.913   592.255                                                        2    1
  V17901009     2585521.216 1225953.420   592.626                                                        2    1
  V17901008     2585457.946 1225882.520   591.856                                                        2    1
  V17901006     2585480.387 1225947.482   592.051                                                        2    1
  63429005      2585490.093 1225929.278   592.197     -1.2     0.1   -2.0     0.7   0.7  -82.5    0.9   14    7
  63400008      2585457.938 1225875.320   592.130     -2.7    -0.2   -2.1     1.9   1.2  -67.2    1.4    6    3
  63400013      2585456.279 1225842.415   591.724 -17081.8 -3789.3   -2.0     3.1   1.9  -79.1    2.2    2    1
  V17925002     2585523.430 1225876.700   591.376                                                        4    2
  V17925003     2585572.647 1225952.922   591.421                                                        0    0
  63429011      2585534.167 1225897.972   592.072     -0.2     0.3    1.0     0.8   0.7  -67.5    0.9   12    6
  V54310889     2585648.393 1226090.240   592.054                                                        0    0
  V55580206     2585610.803 1226017.003   592.188                                                        0    0
  V55580205     2585616.368 1226077.948   593.141                                                        0    0
  V55866004     2585613.145 1226112.445   633.354                                                        0    0
  V55866001     2585610.240 1226087.817   632.736                                                        0    0
  V55865501     2585614.253 1226085.701   626.371                                                        0    0
  V55865502     2585615.698 1226099.905   628.069                                                        0    0
  V55865504     2585603.148 1226091.106   626.377                                                        0    0
  V55865503     2585612.017 1226110.434   627.141                                                        0    0
  V55865005     2585620.993 1226095.343   623.541                                                        0    0
  V55865003     2585612.334 1226107.849   621.777                                                        0    0
  V55865004     2585608.933 1226101.483   623.231                                                        0    0
  sigeom sa                    TITRE: 00634_calc Calcul PFP3 complémentaire                LE 30.04.2020 14:04
  PROGR. DE TRIANGULATION LTOP VERS.: 2011.1.3 - PC(LF-8000)            OPT: MENS. PTS FIXES 4.ORD.  PAGE    3


Imaginons maintenant que j'aimerais récupérer la partie du texte où j'ai des points avec Y, X, H, DY, DX, etc... et que j'aimerais en faire un tableau comment est-ce que je pourrais faire ça?

Merci d'avance pour la réponse
Messages postés
29819
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 octobre 2020
6 841
L'algorithme semble simple.

repère début : " POINT TYPE Y "
repère fin : " sigeom sa "

Lire le fichier ligne par ligne jusqu'à la ligne commençant par le repère de début
Sauter une ligne
Découper les lignes suivantes, les positions semblent fixes, en 3,17, 29, 41, ... pour en faire des éléments d'une liste
Éventuellement nettoyer blancs devant et derrière
Traiter les lignes jusqu'à celle commençant par le repère de fin

Utiliser la liste constituée ...

Il faudra vérifier la structure du fichier sur d'autres contenus, notamment si entête de haut de page peut se retrouver au milieu des données à récupérer.

Messages postés
29
Date d'inscription
mercredi 6 décembre 2017
Statut
Membre
Dernière intervention
9 octobre 2020

Effectivement cela semble pas mal simplement je ne sais pas comment définir les repère de début et de fin pour dire à quel moment il faut commencer à traiter
Messages postés
29819
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 octobre 2020
6 841
???

lecture ligne
si ligne(position 1 à 15) =" POINT TYPE Y " ==> debut du traitement
Messages postés
29
Date d'inscription
mercredi 6 décembre 2017
Statut
Membre
Dernière intervention
9 octobre 2020

je suis désolé mais ça fait un moment que je n'ai plus refait ce genre de chose.
Donc pour le moment j'ai ça comme code :
with open('test.txt', "r") as f:
mylist=list(f)
id=[]
for line in mylist:
f=line.split()
id.extend(f)
print(id[id.index("NULLBERN"):])

Donc avec ça je commence à afficher à partir du texte "NULLBERN"
Mais par contre je ne sais pas comment faire pour dire que le texte il traite ligne par ligne et à partir d'une certaine ligne
Messages postés
29819
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 octobre 2020
6 841
Pour le code sur le forum, il faut choisir dans la liste le type du source (python). Par ailleurs, j'ai modifié ton message, mais il est indispensable d'avoir aussi les indentations du code, c'est primordial, particulièrement avec python.

Beaucoup de lignes, de variables, trop, ("less is more") et je ne vois pas où tu vas.

Je pense que si tu veux écrire du python, il te faudrait suivre une formation sur le langage, depuis le début, jusqu'à la fin. Car un programmeur expérimenté est capable de trouver son bonheur en cherchant la bonne instruction, mais quelqu'un de moins affuté s'y perd.

Après, maitriser le langage et les instructions n'est pas suffisant. Il faut être capable d'imaginer une solution, une démarche, pour résoudre le problème. Là c'est l’algorithmique.

Je te propose le code suivant, qui utilise un indicateur "trait" (drapeau, flag) pour savoir quand on traite les lignes,
.find 
donne la position de la chaine recherchée, -1 si pas trouvée :

with open('fic_texte_1.txt', 'r') as txt:
   trait=False
   for ligne in txt:
      if trait and ligne.find("sigeom sa")>0:
         break             # Fin
      elif ligne.find("NULLBERN")>0:
         trait=True        # Debut
      if trait:
         print(ligne)


Tu peux alors remplacer le
print
en choisissant les infos à reprendre, ou écrire dans un fichier .csv voire, écrire directement dans ta base sqlite.

str.strip
supprime les blancs en début et fin de chaine, et
[1:15]
sélectionne la chaine de position 1 à 15
print(str.strip(ligne[1:15])+";"+str.strip(ligne[16:28])+";"+str.strip(ligne[29:40])+";"+str.strip(ligne[42:50])+"\n")


Messages postés
29
Date d'inscription
mercredi 6 décembre 2017
Statut
Membre
Dernière intervention
9 octobre 2020

Super merci beaucoup ça va bien m'aider.

J'ai déjà suivi un cours de python mais c'était il y a déjà deux ans donc je dois m'y remettre gentiment dedans d'où mes questions qui peuvent être de débutant.

Mais là avec vos réponses ça m'a beaucoup aider donc c'est tip top.