Contenu | Rechercher | Menus

Annonce

T-shirt Seiche Cosmic, Série limitée

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

Ubuntu 18.10
T-shirt Ubuntu-FR « Seiche Cosmique » en série limitée ! Prix spécial pré-vente (15€) jusqu'au 4 novembre 2018.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/05/2018, à 19:14

ar barzh paour

[Résolu] fichier de données

Résolu en utilisant python : voir le script de pingouinux dans le post # 10
bonsoir à tous juste deux questions
1-avec quelles commandes (bash) puis-je lire un fichier octet par octet
(ces octets seront analysés pour traitement)
2- avec quelles commandes (bash) puis-je écrire un octet dans un fichier


============================================================
exemple de contenu de fichier ( un enregistrement )
02    40 00 00 00     2D BC 07 00     F6 F3 45 00     22 41 34 32 20 42 6F 75 72 65 73 72 65 20 3D ..... 34 22    00
============================================================
pour info
je lirai le premier octet , il sera re-écrit tel quel
je lirai les 4 suivants qui seront mémorisés ( c'est la longueur de l'enregistrement ici 40 en hexa)
je lirai les 4 suivants qui seront mémorisés ( et re-écrits tel quel bloc B1)
je lirai les 4 suivants qui seront mémorisés  ( et re-écrits tel quel bloc B2 )
je lirai la fin jusqu'à 00 , (c'est une chaîne ascii C1 ) cette chaîne sera modifiée en chaîne C2

modification de la chaîne
calcul nouvelle longueur de l'enregistrement

écriture
premier octet (02)
écriture nouvelle longueur ( 4 octets par exemple 45 00 00 00 , (en fonction de C2) )
écriture bloc B1  : 2D BC 07 00
écriture bloc B2    : F6 F3 45 00
écriture nouvelle chaîne C2 terminée par  00

ce qui donnerait par exemple
02   45 00 00 00   2D BC 07 00     F6 F3 45 00    puis des octets ascii puis  00 : en tout 45 octets (en hexa)

passer à l'enregistremenr suivant

Dernière modification par ar barzh paour (Le 07/05/2018, à 05:46)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#2 Le 05/05/2018, à 20:42

pingouinux

Re : [Résolu] fichier de données

Bonsoir,
Regarde si la commande xxd peut te convenir (voir le man).
Par exemple, pour voir tous les octets du fichier :

xxd -g1 ton_fichier

Tu peux démarrer la lecture à l'octet que tu veux (paramètre -s), et lire le nombre d'octets que tu veux (paramètre -l).
Pour écrire le fichier binaire modifié :

xxd -r fichier_texte_modifié >fichier_binaire_modifié

Hors ligne

#3 Le 06/05/2018, à 07:04

ar barzh paour

Re : [Résolu] fichier de données

bonjour pingouinux

je ne sais pas si je vais y arriver
volilà où j'en suis
lecture du premier enregistrement

#!/bin/bash
cd /media/Data/informatique/GPS-VIA53/F
#xxd -g1 F-A.ov2

seek=0
typ=$(xxd               -l1  -ps F-A.ov2) ; ((seek++))
ln1=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
ln2=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
ln3=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
ln4=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
lo1=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
lo2=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
lo3=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
lo4=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
la1=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
la2=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
la3=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
la4=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))

ch=""
while [[ $seek -lt $ln1 ]] # en fait il faut utiliser ((lon=0x$ln1)) mais while ne fonctionne plus tel quel
do
sut=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++))
ch=$ch$sut
done


echo $typ 
echo $ln1 $ln2 $ln3 $ln4
echo $lo1 $lo2 $lo3 $lo4
echo $la1 $la2 $la3 $la4
echo $ch
echo
echo "Taper sur Entrée"

le résultat

02
40 00 00 00
2d bc 07 00
f6 f3 45 00
2241343220426f75726720656e20427265737365203d3e204c796f

Taper sur Entrée

maintenant il me reste à
modifier la "chaine" ch
recalculer la longueur
re-écrire le tout suivant le bon format

(la boucle while n'est pas bonne , valeur ln1 prise comme valeur décimale )
(il faut que je trouve une commande qui me transforme 40 décimal  en 40 hexa
(expr? peut-être ou quelquechose comme ((ln=0xln1))
xxd me rappelle od

Dernière modification par ar barzh paour (Le 06/05/2018, à 14:29)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#4 Le 06/05/2018, à 10:02

credenhill

Re : [Résolu] fichier de données

hello
on peut faire le traitement dans awk

$ xxd -p -c 256 fichier | awk 'BEGIN {FIELDWIDTHS="2 8 8 8 128"} {print $1 RS $2 RS $3 RS $4 RS $5}' 
02
40000000
2dbc0700
f6f34500
2241343220426f757265737265203d342200

Dernière modification par credenhill (Le 06/05/2018, à 13:28)

Hors ligne

#5 Le 06/05/2018, à 14:17

ar barzh paour

Re : [Résolu] fichier de données

hello credenhill
ok pour 2 8 8 8
128 me donne les champs 5 à 128 caractères alors que leur longueur est variable
les champs 5 sont tous formatés je pense ainsi : 22 puis des caractères ascii puis 22 suivi de 00

02
40000000
2dbc0700
f6f34500
2241343220426f75726720656e20427265737365203d3e204c796f6e2020283031292041697265204343492032393934342200024800000016fd05005a744b00
44
20283131
29204169
72652043
434920322200024e0000002ce10300cae2410022413631204e6172626f6e6e653d3e546f756c6f75736520416972652064657320434f52424945524553204e6f

je pense que ça va être compliqué de faire en bash
je réussis à lire les champs correctement
mais le plus compliqué ça être de re-écrire les octets correctement dans un fichier après avoir modifié le champ 5
c'est un va et vient de chaine en hexa ,et même décimal  et de hexa , décimal en chaine
si c'est trop compliqué , je pense repartir de zéro  ( partir d'un fichier texte csv  (qui existe) et de tout récréer au bon format )


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#6 Le 06/05/2018, à 14:30

ar barzh paour

Re : [Résolu] fichier de données

#!/bin/bash
cd /media/Data/informatique/GPS-VIA53/F
rmp tmp.dat
xxd -g1 F-A.ov2
longueur=$(wc -c F-A.ov2|cut -d' ' -f1)
seek=0
deb=0
function trt_chaine {
:
# à venir
}

while [[ $seek -lt $longueur ]]
    do
    echo "seek : " $seek
    typ=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $typ
    
    if [[ ! $typ = "02" ]]
    then
        echo "type $typ attention un type différent de 02 , je ne sais pas faire"
        break
    fi
    ln1=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $ln1
    ln2=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $ln2
    ln3=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $ln3
    ln4=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $ln4
    lo1=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $lo1
    lo2=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $lo2
    lo3=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $lo3
    lo4=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $lo4
    la1=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $la1
    la2=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $la2
    la3=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $la3
    la4=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) #; echo $la4


    ((lon=0x$ln1))            ; echo "lon    :" $lon
    ((jusqua=$lon+$deb-1))    ; echo "jusqua :" $jusqua

    ch=""
    while :                           # impossible de faire fonctionner while [[ $seek -lt $jusqua ]]     !!!!!!
    do
        if  [[ $seek -lt $jusqua ]]
        then
            sut=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; (( seek++ ))
            ch=$ch$sut
        else 
            break
        fi
    done
    fin=$(xxd  -seek $seek  -l1  -ps F-A.ov2) ; ((seek++)) # doit être 0
# pour avoir une trace visuelle
    echo $typ 
    echo $ln1 $ln2 $ln3 $ln4
    echo $lo1 $lo2 $lo3 $lo4
    echo $la1 $la2 $la3 $la4
    echo $ch
    echo $fin

# ceci me donnne une trace dans un fichier mais tout est en format chaine avec retour chariot
# par exemple le premier octet 02 est transformé en 30 32 0A , ce qui ne me va pas    
    echo $typ                        >> tmp.dat
    echo $ln1$ln2$ln3$ln4 >> tmp.dat
    echo $lo1$lo2$lo3$lo4 >> tmp.dat
    echo $la1$la2$la3$la4 >> tmp.dat
    echo $ch                         >> tmp.dat
    echo $fin                        >> tmp.dat
    ((deb=$seek))
done

Dernière modification par ar barzh paour (Le 06/05/2018, à 14:34)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#7 Le 06/05/2018, à 14:40

credenhill

Re : [Résolu] fichier de données

j'ai mis 128 pour prendre le reste de la ligne dans le champ 5, en pensant que les enregistrements sont séparés par \n
pour réecrire en binaire, cf post #2

... |  xxd -r -p > newbin

Dernière modification par credenhill (Le 06/05/2018, à 14:53)

Hors ligne

#8 Le 06/05/2018, à 15:21

pingouinux

Re : [Résolu] fichier de données

Personnellement, je ferais plutôt ça en python.
Il faudrait un exemple de fichier de départ (en donnant le résultat de cette commande)

xxd ton_fichier

et que tu indiques le traitement que tu veux appliquer au 5ème champ.

Hors ligne

#9 Le 06/05/2018, à 17:10

ar barzh paour

Re : [Résolu] fichier de données

un peu compliqué à expliquer mais je tente
un exemple de fichier contenant 2 enregistrements

00000000: 0240 0000 002d bc07 00f6 f345 0022 4134  .@...-.....E."A4
00000010: 3220 426f 7572 6720 656e 2042 7265 7373  2 Bourg en Bress
00000020: 6520 3d3e 204c 796f 6e20 2028 3031 2920  e => Lyon  (01) 
00000030: 4169 7265 2043 4349 2032 3939 3434 2200  Aire CCI 29944".
00000040: 0248 0000 0016 fd05 005a 744b 0022 4132  .H.......ZtK."A2
00000050: 3620 5361 696e 7420 5175 656e 7469 6e3c  6 Saint Quentin<
00000060: 3d52 6569 6d73 204d 4f4e 5420 4445 204e  =Reims MONT DE N
00000070: 495a 5920 2830 3229 2041 6972 6520 4343  IZY (02) Aire CC
00000080: 4920 3239 3035 2200                      I 2905"

.

premier enregistement
02          : (ce sera toujours le cas)
40 00 00 00 : longueur : ici hexa40 = 64
2d bc 07 00 : longitude : ne bougera pas
f6 f3 45 00 : latitude  : ne bougera pas

22 41 34
32 20 42 6f 75 72 67 20 65 6e 20 42 72 65 73 73
65 20 3c 3d 20 4c 79 6f 6e 20 20 28 30 31 29 20
41 69 72 65 20 43 43 49 20 32 393 9 343 4 22
          la chaine ici "A42 Bourg en Bresse <= Lyon  (01) Aire CCI 29944"
00 fin d'enregistrement


2ème enregistrement
02              (même valeur que enregistrement 1)
48 00 00 00 : longueur : ici hexa 48 = 72
16 fd 05 00 : longitude : ne bougera pas
5a 74 4b 00 : latitude  : ne bougera pas

22 41 32
36 20 53 61 69 6e 74 20 51 75 65 6e 74 69 6e 3d
3e 52 65 69 6d 73 20 4d 4f 4e 54 20 44 45 20 4e
49 5a 59 20 28 30 32 29 20 41 69 72 65 20 43 43
49 20 32 39 30 35 22
     la chaine ici donne "A26 Saint Quentin<=Reims MONT DE NIZY (02) Aire CCI 2905"
00 fin d'enregistrement


le traitement à appliquer dépendra du fichier à traiter
dans le cas présent
-ajout en tête de la chaine de A espace  ( sur un autre fichier ce pourra être S ou SN ou PN ou PCC ou ...)
remplacement de "Aire CCI" par "#"
remplacement de "=>"  par =#
remplacement de "<="  par #=
remplacement de "<=>" par #=# ( n'apparait pas dans l'exemple )
la chaine devient   "A A42 Bourg en Bresse =# Lyon  (01) # 29944"
et donc la longueur deviendra 64+2-7=59 soit 3B

et l'enregistrement à écrire sera donc

premier enregistement
02         
3B 00 00 00 : longueur : ici hexa 3B = 59
2d bc 07 00 : longitude
f6 f3 45 00 : latitude 
                           la nouvelle chaine
22 41 20 41 34
32 20 42 6f 75 72 67 20 65 6e 20 42 72 65 73 73
65 20 3d 23 20 4c 79 6f 6e 20 20 28 30 31 29 20
23 20 32 393 9 343 4 22
           la chaine ici "A A42 Bourg en Bresse =# Lyon  (01) # 29944"

00 fin d'enregistrement


deuxième enregistrement
-ajout en tête de la chaine de A espace  ( sur un autre fichier ce pourra être S ou SN ou PN ou PCC ou ...)
remplacement de "Aire CCI" par "#"
remplacement de "=>"  par =#
remplacement de "<="  par #=
remplacement de "<=>" par #=# ( n'apparait pas dans l'exemple )
la chaine devient   "A A26 Saint Quentin#=Reims MONT DE NIZY (02) # 2905"
et donc la longueur deviendra 72+2-7=67 soit 43
et l'enregistrement à écrire donc

02
43 00 00 00 : longueur : ici hexa 43 = 67
16 fd 05 00 : longitude
5a 74 4b 00 : latitude 
    la nouvelle chaine
22 41 20 41 32
36 20 53 61 69 6e 74 20 51 75 65 6e 74 69 6e 23
3e 52 65 69 6d 73 20 4d 4f 4e 54 20 44 45 20 4e
49 5a 59 20 28 30 32 29 20 23
20 32 39 30 35 22
(la chaine ici donne "A A26 Saint Quentin#=Reims MONT DE NIZY (02) # 2905"

00 fin d'enregistrement


remarque
les transformations n'influençant pas la longueur , je saurais faire en bash
remplacement de "=>"  par =#
remplacement de "<="  par #=
remplacement de "<=>" par #=#


et certainement que python est plus adapté mais je n'y connais rien

Dernière modification par ar barzh paour (Le 06/05/2018, à 17:15)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#10 Le 06/05/2018, à 17:50

pingouinux

Re : [Résolu] fichier de données

Tu peux essayer ce script

#!/usr/bin/env python3
import sys, re

fic_i=sys.argv[1]
fic_o=sys.argv[2]
#==================================================
def lire(f) :
  typ=f.read(1)
  if not typ: exit()
  lon=int.from_bytes(f.read(4),sys.byteorder)
  bl1=f.read(4)
  bl2=f.read(4)
  suite=f.read(lon-1-4-4-4)
  return typ, lon, bl1, bl2, suite
#==================================================
def ecrire(f) :
  f.write(typ)
  f.write(lon.to_bytes(4,sys.byteorder))
  f.write(bl1)
  f.write(bl2)
  f.write(suite)
#==================================================
def trace(s,tit=''):
 print("%-5s= "%tit,end='')
 for k in s: print("%02x"%(k),end='')
 print()
#==================================================

with open(fic_i,'rb') as f, open(fic_o,'wb') as g :
 while True:
   print()
   typ, lon, bl1, bl2, suite = lire(f)

   trace(typ,'typ')
   print("lon avant = %d"%lon)
   trace(bl1,'bl1')
   trace(bl2,'bl2')
   trace(suite,'suite avant')

   suite=re.sub(b'^"',b'"A ',suite)
   suite=re.sub(b'Aire CCI',b'#',suite)
   suite=re.sub(b'=>',b'=#',suite)
   suite=re.sub(b'<=',b'#=',suite)

   lon=1+4+4+4+len(suite)
   print("lon après = %d"%lon)
   trace(suite,'suite après')

   ecrire(g)

à lancer ainsi

./le_script.py fichier_d_entrée fichier_de_sortie

Édité : Correction du script suite à la remarque de ar barzh paour en #12

Dernière modification par pingouinux (Le 06/05/2018, à 21:51)

Hors ligne

#11 Le 06/05/2018, à 17:52

diesel83140

Re : [Résolu] fichier de données

A priori, tu n'as que du texte dans ton fichier (ou pas loin).

Pourquoi tu veux de faire ierch à traiter en hexa ?

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; C'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#12 Le 06/05/2018, à 19:13

ar barzh paour

Re : [Résolu] fichier de données

@diesel
tu n'as pas bien analysé le fichier ( les enregistrements)
mais tu as raison , tout en ascii sauf les 17 premiers octets et le dernier
@pingouinux
je vais être obligé de me mettre à python
l'exemple que tu me donnes est un bon appuis
j'essaierai dans la soirée et te donne le retour


c'est presque ça sauf que les chaînes commencent par A " au lieu de commencer par "A
le reste me parait correct

c'est de ma faute
car j'ai écrit "mettre A " en début de chaîne , sauf qu'n fait on a
guillemet chaîne guillemet 00
ce que je voulais dire c'est "mettre A " après le premier guillemet qui indique le début de la chaîne
c'est à dire pour ce fichier mettre
guillemet A espace chaîne guillemet 00


est-ce que au lieu de
suite=re.sub(b'^',b'A ',suite)   mettre
suite=re.sub(b'^"',b'A "',suite)    erreur de recopie

suite=re.sub(b'^"',b'"A ',suite)

réglerait ça ? (j'y connais rien j'ai supposé que ^ était le début de la chaîne suite)

je constate que c'est beaucoup plus simple qu'en bash , si on connaît la syntaxe de python ...

Dernière modification par ar barzh paour (Le 07/05/2018, à 05:49)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#13 Le 06/05/2018, à 21:48

pingouinux

Re : [Résolu] fichier de données

ce que je voulais dire c'est "mettre A " après le premier guillemet qui indique le début de la chaîne
c'est à dire pour ce fichier mettre
guillemet A espace chaîne guillemet 00

Tu y es presque.
Ce n'est pas

suite=re.sub(b'^"',b'A "',suite)

mais

suite=re.sub(b'^"',b'"A ',suite)

Ajouté : J'ai corrigé le script en #10

Dernière modification par pingouinux (Le 06/05/2018, à 21:52)

Hors ligne

#14 Le 07/05/2018, à 05:41

ar barzh paour

Re : [Résolu] fichier de données

merci pingouinux
sad je n'ai plus rien à faire sad
ce script fonctionne parfaitement ,il ne me reste plus qu'à l'utiliser
remarque

suite=re.sub(b'^"',b'"A ',suite)

c'est ce que j'avais mis dans mon script , et que j l'ai mal recopié (j'aurais du utiliser un coller/copier)

je commence à comprendre un peu la syntaxe de python (enfin celle de ce script)
enfin certaines sont plus compliquées

lon=int.from_bytes(f.read(4),sys.byteorder)
f.write(lon.to_bytes(4,sys.byteorder))

je vais chercher un site d'apprentissage de python

Dernière modification par ar barzh paour (Le 07/05/2018, à 05:48)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#15 Le 07/05/2018, à 06:48

pingouinux

Re : [Résolu] fichier de données

enfin certaines sont plus compliquées

lon=int.from_bytes(f.read(4),sys.byteorder)

Lit 4 octets et les convertit en entier, l'ordre des octets étant celui de ton système.

f.write(lon.to_bytes(4,sys.byteorder))

Écrit un entier sur 4 octets, l'ordre des octets étant celui de ton système.

On peut préciser l'ordre des octets, si par exemple on lit un fichier écrit avec un ordre différent.
Il faut dans ce cas remplacer sys.byteorder par :
- 'little' : bit de poids faible en premier (appelé little endian), c'est le cas de ton fichier
- 'big' : bit de poids fort en premier (appelé big endian)

Remarque : Put-être plus lisible pour transformer la chaîne

   for old,new in ( (b'^"',      b'"A '),
                    (b'Aire CCI',b'#'),
                    (b'=>',      b'=#'),
                    (b'<=',      b'#=')
                  ): suite=re.sub(old,new,suite)

Hors ligne

#16 Le 16/05/2018, à 16:34

ar barzh paour

Re : [Résolu] fichier de données

@ pingouinux , si tu repasses par là

j'ai essayé en python , je m'en suis sorti mais pas simplement
(au moins je commence à utiliser un peu python)

au lieu de rajouter  "A " au début de la chaîne , j'ai voulu ajouter   une variable (aire) contenant "A "
(l'intérêt bien sur est de pouvoir modifier facilement cette valeur lors de l'appel du script)
ce que j'ai fait

aire=sys.argv[3]  # je récupère la valeur lors de l'appel

mais je n'ai pas trouvé comment utiliser

suite=re.sub(b'^"' , quelquechose)

je suis passé par

c1=suite.decode(encoding="latin-1") # transforme suite en chaine
c1=c1[0]+aire+" "+c1[1:255]                 # ajoute la variable en début de chaîne (j'ai supposé 255 caractères max )
suite=c1.encode(encoding="latin-1") # retransforme  en bytes

Dernière modification par ar barzh paour (Le 16/05/2018, à 16:36)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne

#17 Le 16/05/2018, à 16:49

pingouinux

Re : [Résolu] fichier de données

ce que j'ai fait

aire=sys.argv[3]  # je récupère la valeur lors de l'appel

mais je n'ai pas trouvé comment utiliser

suite=re.sub(b'^"' , quelquechose)

Ceci devrait marcher :

aire=bytes(sys.argv[3],'utf8')  # ou bien : aire=bytes(sys.argv[3],'latin1')
suite=re.sub(b'^"' , b'"'+aire)

Édité : Correction

Dernière modification par pingouinux (Le 16/05/2018, à 17:51)

Hors ligne

#18 Le 17/05/2018, à 10:44

ar barzh paour

Re : [Résolu] fichier de données

@ pingouinux

merci ça parait simple quand c'est écrit !

aire=sys.argv[3]

   ajout=bytes(aire+" ",'latin1')            #le type de codage est obligatoire 'utf8,'latin1',....     
   suite=re.sub(b'^"',b'"'+ajout,suite)      # et on peut concaténer

remarques :
1- je me suis aperçu que la suite était codée en latin-1 et non en utf-8
2- la chaine aire que je passe ne contient que des caractères majuscules [A-Z] (latin1 ou utf8)

Dernière modification par ar barzh paour (Le 17/05/2018, à 10:50)


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubiuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
(03/2018) : PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
(06/2017) : Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 16.04

Hors ligne