#1 Le 05/05/2018, à 18: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, à 04:46)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#2 Le 05/05/2018, à 19: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, à 06: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, à 13:29)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#4 Le 06/05/2018, à 09: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, à 12:28)
Hors ligne
#5 Le 06/05/2018, à 13: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 )
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#6 Le 06/05/2018, à 13: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, à 13:34)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#7 Le 06/05/2018, à 13: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, à 13:53)
Hors ligne
#8 Le 06/05/2018, à 14: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, à 16: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, à 16:15)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#10 Le 06/05/2018, à 16: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, à 20:51)
Hors ligne
#11 Le 06/05/2018, à 16:52
- diesel
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.
En ligne
#12 Le 06/05/2018, à 18: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, à 04:49)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#13 Le 06/05/2018, à 20: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, à 20:52)
Hors ligne
#14 Le 07/05/2018, à 04:41
- ar barzh paour
Re : [Résolu] fichier de données
merci pingouinux
je n'ai plus rien à faire
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, à 04:48)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#15 Le 07/05/2018, à 05: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, à 15: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, à 15:36)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#17 Le 16/05/2018, à 15: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, à 16:51)
Hors ligne
#18 Le 17/05/2018, à 09: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, à 09:50)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#19 Le 03/06/2019, à 09:43
- ar barzh paour
Re : [Résolu] fichier de données
pour ceux qui commencent python je mets ici quelques infos
dans un terminal tapez python3 ( qui aura été installé auparavant)
==> donne le prompt >>>
au prompt >>> tapez help() ==> donne le prompt help>
au prompt help> tapez modules ==> donne la liste des modules utilisables
au prompt help>tapez math ==> donne la description du module math
remarque dans un terminal la commande
python ou python2 me lance Python 2.7.15rc1
python3 ou python 3.6 me lance Python 3.6.7
python 3.7 me lance Python 3.7.1
un lien vers une documentation
https://docs.python.org/fr/3/
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne