4. Fichiers et indexation
Données numériques
Une donnée informatique est un élément d'information ayant subi un encodage numérique
- Consultable/manipulable/échangeable par des programmes informatiques
-
Possibilité de la conserver sur un support de stockage numérique (CD-ROM, disque dur, SSD, …)
-
Les informations peuvent être stockés dans un fichier (ex : fichier csv).
-
Types de données
- Données quantitatives:
-
numérique entier ou réel, discrètes ou continues, bornées ou non. ex: poids, taille, âge, taux d’alcoolémie,…
-
temporel : date, heure
-
numéraire
-
etc…
-
- Données qualitatives:
-
de type vrai/faux (données booléennes). ex: marié/non marié, majeur/non majeur
-
de type appartenance à une classe. ex: célibataire/marié/divorcé/veuf, salarié/chômeur/retraité etc…
-
de type texte (autrement dit “chaine de caractères”). ex: nom, prénom, ville,…
-
Donnée numérique
- D'un point de vue informatique,
- il n'existe pas de distinction entre le quantitatif et le qualitatif.
- Tout est valeur numérique.
- Une valeur numérique (digitale) consiste en:
-
un champ de bits (dont la longueur est exprimée en octets)
-
un processus de décodage : le format (ou type)
-
Donnée numérique
-
Les données manipulées par un programme:
-
sont codées sous un format binaire,
-
correspondant à un des types informatiques que vous connaissez déjà :
-
entier,
-
chaîne de caractères,
-
réel simple ou double précision etc…
-
-
ce qui implique en particulier :
-
une précision finie,
-
éventuellement des contraintes de place (le nom ou le prénom ne pouvant pas dépasser n caractères, les entiers pouvant être choisis sur un intervalle fini etc…).
-
-
Types de données standard
- INTEGER : entier (codage classique sur 4 octets),
- FLOAT : nombre à virgule flottante simple précision (4 octets),
- DOUBLE : nombre à virgule flottante double précision (8 octets),
- CHAR : caractère (symbole sur 1 octet)
- STRING : chaîne de caractères (un texte d,e longueur quelconque),
- DATE, ex: '2005-12-12' (12 décembre 2005)
- TIME, ex: '10:45:02' (10 h 45 min 2 s)
- DATETIME, ex: '2005-12-12 10:45:02'
- DECIMAL, ...
Production des données
Tout commence par une fiche à remplir…

Production des données
Tout commence par une fiche à remplir…
-
Un formulaire se présentant sous la forme d’un ensemble de rubriques à remplir.
-
Le modèle de fiche définit le format des données à enregistrer:
-
liste des rubriques du formulaire,
-
domaine de valeurs attendues dans chaque rubrique.
-
-
A toute fiche remplie correspond un jeu de valeurs (ou mesure) :
-
liste de valeurs correspondant au contenu d’une fiche particulière.
-
-
D’un point de vue informatique, un jeu de valeurs recueilli est appelé un enregistrement
-
correspondant à l’encodage des données recueillies sur un support numérique
-
-
Une structure de données définit les données de manière logique,
-
c’est à dire l’ordre dans lequel elles doivent être lues
-
et la manière dont elles doivent être interprétées par les programmes qui les utilisent.
-
-
Exemples de structures de données (cours d'algorithmie):
-
listes,
-
listes de listes,
-
dictionnaires,
-
arbres,…
-
Stockage des données
Transport des données

-
La transmission des données entre programmes nécessite l’ouverture d’un canal de communication:
-
entre client et serveur
-
par lequel transitent les données (les requêtes et les réponses).
-
Transport des données
-
Le transport est géré:
-
par le système d’exploitation (lorsque les données transitent au sein d’un même ordinateur)
-
ainsi que par des routeurs (lorsque les données transitent d’un ordinateur à l’autre sur le réseau).
-
-
Au niveau du client,
-
les réponses en provenance du serveur sont organisées sous la forme d’une liste,
-
qu’on appelle un flux de données.
-
Requête
- En informatique, une requête (en anglais query)
- est une demande de consultation,
- effectuée par un programme client
- à l’attention d’un programme serveur.

Requête
- Une requête peut être :
- une simple référence vers un fichier
- l’expression d’une recherche plus spécifique:
- consultation de certaines fiches d’un fichier,
- croisement d’information (entre plusieurs fichiers),
- etc…)
- Dans ce cas, il est nécessaire d’utiliser un langage de requête (le plus souvent SQL).

Client/Serveur
-
Le programme client représente l’utilisateur, il s’agit du programme qui
-
enregistre la demande de l’utilisateur,
-
la transmet au serveur,
-
puis met en forme visuellement la réponse du serveur.
-
-
Les données sont centralisées au niveau du serveur, chargé de :
-
la gestion,
-
de la manipulation
-
et du stockage des données.
-
Il traite la requête, consulte les données et transmet le résultat au client.
-
Types de requêtes
- On distingue quatre grands types de requêtes (approche “CRUD”):
-
Création (Create) : ajout de nouvelles données dans la base
-
Lecture/recherche (Read) : consulation du contenu de la base
-
Mise à jour (Update) : changement du contenu existant
-
Suppression (Delete) : suppression des données obsolètes
-
Ordre des réponses
Exemples :
-
Requêtes http :
-
demande de consultation d’une page web
-
URL = référence vers un fichier
-
-
Moteur de recherche :
-
recherche de pages contenant les mots-clés spécifiés
-
-
Bases de données : utilisation d’un langage de requête :
SELECT *
FROM Eleves
WHERE NOM = 'Dugenou'Ordre des réponses
- Lors d’une consultation de type lecture/recherche,
- il y a souvent plusieurs réponses qui correspondent à la demande.
- Le résultat d’une requête prend donc la forme d’un ensemble de réponses.
- Ces réponses sont éventuellement classées,
- selon la valeur d’un certain identifiant,
- ou selon le degré de pertinence.
4.1 Mémoire
Données persistantes
- Les données persistantes:
- sont une des composantes essentielles des programmes informatiques.
- Il s'agit par définition des informations qui doivent être conservées entre deux exécutions.
- les quantités de données conservées ont considérablement augmenté au cours des dernières décennies.
- Nous aborderons:
- Le stockage de ces données sur un support informatique (Fichiers, bases de données)
- les méthodes permettant de consulter et mettre à jour régulièrement ces données.
Structure de stockage
-
La conservation des données repose principalement sur la structure de stockage,
-
définissant la manière dont les données sont physiquement stockées sur le support,
-
autrement dit la méthode de rangement de la série de mesures :
-
fichiers,
-
répertoires,
-
index,
-
etc…
-
-
reposant sur des supports de stockage (ou mémoires) :
-
mémoire centrale,
-
mémoires secondaires (disque dur, CD-ROM, memoire flash (SSD), etc…).
-
-
Tableau statique
Le tableau statique correspond à l'organisation séquentielle fondamentale des mémoires informatique :
-
taille limitée du support matériel
-
données accessibles grâce à leur adresse (position dans le tableau)
-
problème de rangement:
-
il faut conserver une information sur la position des données déjà enregistrées
-
organisation logique des données sur le support.
-
Tableau statique
Dans un tableau statique T, la position des cases reste fixe au cours de l'utilisation :
-
T[i] désigne toujours la mếme zone mémoire
-
Analogie : les pages d'un cahier
Tableau dynamique
Dans un tableau dynamique (liste python par exemple), la position des cases varie au cours de l'utilisation :
-
T[i] ne désigne pas toujours la mếme zone mémoire
-
Analogie : briques de lego, puzzle glissant


Mémoires adressables
- Les mémoires à accès aléatoire (Random Access Memory - RAM)
- stockent les données mémorisées dans un tableau statique
- les données sont consultables grâce à leur adresse
- L'adresse est l'équivalent pour la mémoire de l'index des tableaux de données

Adresse
Structure de stockage
- Les mémoires informatiques sont des structures statiques. Une fois les données enregistrées, il est difficile d’insérer ou de supprimer des éléments.
- La difficulté consiste à définir une organisation logique du tableau permettant de gérer efficacement un tel ensemble (qui peut être de grande taille) :
-
savoir où enregistrer les données
-
savoir comment les retrouver
-
- On parle de structure de stockage. Une telle structure doit permettre :
-
d’ajouter des données
-
d'effacer des données
-
d’accéder rapidement à une case particulière
-
Stockage dense
- On considère un ensemble de k données stockés dans un tableau de données statique T de n cases (avec 0≤k ≤ n).
- Propriété : les données sont stockés dans les k premières cases du tableau. Ainsi, les cases de 0 à k-1 sont occupées et l'indice k désigne la première case libre.

Stockage dense
Problème : définir des opérations :
- de recherche
- d'insertion
- de suppression
qui conservent la propriété du tableau

Insertion : O(1)

Algo : insertion
Données :
- d : donnée à insérer
- T : tableau de données
- k : indice
Début :
T[k] <-- d
k <-- k + 1
FinRecherche : O(k)

Algo : recherche
Données :
- d : donnée à trouver
- T : tableau de données
- k : indice
Retourne :
un indice
Début :
pour i de 0 à k-1 :
si T[i] = d:
retourner i
retourner -1
FinSuppression : O(k)

Algo : suppression
Données :
- d : donnée à supprimer
- T : tableau de données
- k : indice
Début :
i <-- recherche(d,T,k)
si i != -1:
T[i] <-- T[k-1]
k <-- k-1
FinStockage distribué
Table d'allocation:
-
On considère un tableau de taille n dans lequel k<n cases sont occupées.
-
Chaque bloc de données d est indexée par l'adresse i<n donnant sa position dans le tableau
-
On connaît également sa taille m
-
-
La table d'allocation donne pour chaque bloc :
-
son adresse i
-
le nombre m de cases occupées
-
un indicateur LIBRE/OCCUPE
-
Stockage distribué
Stratégies d'allocation
-
Plus proche choix : la liste des blocs libres est parcourue jusqu’à trouver un bloc de la taille demandée (ou sinon, le premier bloc de taille supérieure, qui est alors découpé en deux blocs).
-
first fit : le premier bloc suffisamment grand pour les besoins
-
best fit : le plus petit bloc qui ait une taille au moins égale à la taille demandée
-
worst fit : le plus grand bloc disponible (qui est donc découpé)
-
Exercice
Écrire un algorithme permettant d'insérer une donnée d de taille m dans le premier bloc libre disponible (pensez à mettre à jour la table d'allocation B).
Algo : insertion
Données :
- T: tableau de données
- d: donnée à insérer
- m: taille de la donnée
- B: table d allocation
Retourne:
adresse de d après insertion
Début
pour tout triplet (i,m_i,f_i) dans B:
si m_i <= m et f_i = LIBRE:
T[i] <-- d
supprimer (i, m_i, f_i) dans B
insérer (i, m, OCCUPE) dans B
insérer (i+m, m_i-m, LIBRE) dans B
retourner i
retourner -1
Fin
Liste dynamique
-
On appelle liste une structure abstraite ordonnée telle que:
-
l'on puisse accéder de manière directe à l'élément i
-
et à laquelle on puisse ajouter (et supprimer) autant d'éléments que l'on souhaite.
-
Une caractéristique importante de cette structure est son nombre d'éléments.
On commence par créer un tableau de taille n = 1,
Le nombre initial d éléments est k = 0
A chaque ajout d élément:
si k < n,
ajouter l élément à la position k
k ← k + 1
sinon :
allouer un tableau à 2 * n éléments
n ← n * 2
copier les k premiers éléments du tableau initial dans le nouveau tableau
supprimer le tableau initial
ajouter l élément à la position k
k ← k + 14.2 Indexation
Principe
-
Pour une gestion efficace des données,
-
il est nécessaire de pouvoir identifier chaque enregistrement de façon unique.
-
-
L'indexation des données
-
repose sur un principe simple d'étiquetage
-
consistant à attribuer une étiquette différente à chaque enregistrement.
-
-
Cette étiquette peut être
-
une suite de caractères arbitraires,
-
un entier,
-
ou un descripteur explicite.
-
-
On parle en général de clé ou d'identifiant pour désigner cette étiquette.
Définition
- L'indexation des données consiste à attribuer à chaque donnée distincte un identifiant unique.
- On parle également de clé de l'enregistrement:
- On peut représenter l'opération d'indexation sous la forme d'une fonction:
- Si d est le jeu de valeurs
- id(d) désigne l'identifiant de ce jeu de valeurs
Unicité/spécificité
L'indexation suppose l'existence d'une bijection entre l'ensemble des données et l'ensemble des clés, permettant d'assurer l'unicité et la spécificité de la clé.
Soient d1 et d2 deux enregistrements,
-
Unicité :
-
si d1=d2 alors id(d1)=id(d2).
-
-
Spécificité:
-
si id(d1)=id(d2), alors d1=d2.
-
Fonction d'adressage
- L'existence d'un identifiant unique pour chaque donnée d permet la mise en œuvre d'une recherche par identifiant (ou recherche par clé).
-
La recherche par identifiant repose sur une fonction d'adressage H qui à tout identifiant id(d) associe sa position (adresse) ref(d) dans un tableau de données:
H: ens. des identifiants → ens. des adresses
id(d) → ref(d)
-
Ainsi si id est l'identifiant servant à la recherche, l'extraction des informations se fait en 2 étapes:
-
ref=H(id) (lecture de l'adresse des données)
-
d=T[ref] (lecture de la donnée elle-même)
-
Mise en oeuvre
Exemple : avec des listes:
Soit une liste:
L=((id1:ref1),(id2:ref2),…,(idN:refN))
telle que id1<id2<…<idN,
La recherche de l'adresse dans lune liste triée s'effectue en O(log N) (recherche dichotomique).
Exemples d'adressages:
- Table des matières (en-têtes de chapîtres) --> num de page
- nom de variable --> valeur
- chemin d'accès (fichiers) --> adresse des données sur le support physique
- URL --> adresse IP (L'index est fourni par un serveur de noms)
- code d'accès --> contenu
Définition : On appelle index la structure de données qui implémente la fonction d'adressage
Compacité
- L'identifiant doit en pratique tenir sur un nombre d'octets le plus petit possible pour que la liste L puisse être manipulée en mémoire centrale.
- Autrement dit, il faut que :
- |id(d)|<<|d|
-
pour que :
- |L|<<|T|
Un identifiant entier, codé sur 4 octets, permet d'indexer jusqu'à données différentes.
Unicité des données et Structure d'ensemble
- L'index assure l'unicité des données (pas de doublons).
- Soit E un ensemble de données indexées :
- E={d1,d2,…,dK}
-
On a l'équivalence :
- d∈E⇔id(d) ∈ Index(E)
-
Ainsi, il ne peut y avoir de doublon car :
- ∀d ∈ E, id(d) est unique
- ∀ id ∈ Index(E) , ref(id) est unique
Index
E
ref
id
Exemples d'indexation des données
L'exemple le plus simple d'indexation est celui fourni par les numéros de case d'un tableau.
- Soit T un tableau de n lignes, le numéro de case i<n est à la fois :
- l'identifiant
- et l'adresse (la référence) de la ligne T[i]

!! L'ajout ou la suppression
de données viole
le principe d'unicité
de l'index
Exemples d'indexation des données
Maintenance centralisée d'un index
- Lors de l'ajout de nouvelles données, il est nécessaire de définir une méthode permettant d'assurer:
-
l'unicité de l'identifiant
-
d --> id
-
-
l'intégrité de l'index (fonction d'adressage)
-
id --> d
-
-
Exemples d'indexation des données
Exemple :
- Le programme maintient une liste triée des identifiants déjà utilisées.
- Lors de l'ajout d'une nouvelle donnée, il s'assure que l'identifiant n'est pas déjà présente dans la liste.
-
Coût :
-
O(n) en mémoire
-
O(log n) pour la vérification, O(n) pour l'ajout
-
-
- intégrité id--> d : OK
- unicité d --> id : OK
Exemples d'indexation des données
Exemple :
-
Dans le cas où les identifiants sont des numéros (entiers), il est possible d'utiliser un compteur qui s'incrémente à chaque nouvelle insertion.
-
Coût :
-
O(n) en mémoire (adressage)
-
O(1) pour l'ajout
-
- intégrité id--> d : OK
- unicité d --> id : KO !!
Exemples d'indexation des données
Exemples d'indexation centralisée :
-
numéro INE (étudiants)
-
numéro URSSAF (sécurité sociale)
-
numéro d'immatriculation (véhicules)
-
numéro de compte en banque
-
code barre
-
etc.
Indexation pseudo-aléatoire : les fonctions de hachage
Utilisation d'une fonction de hachage :
H : ens des données --> ens. des identifiants
d --> id = H(d)
-
qui "calcule" la valeur de l'identifiant à partir des valeurs du jeu de valeurs à insérer.
-
La fonction de hachage doit être telle que la probabilité de choisir le même identifiant pour deux données différentes soit extrêmement faible.
- unicité d --> id(d) : presque OK!
Etape 1 : transcodage binaire des données
id = int.from_bytes(d, byteorder='big')
-
avantage : les données différentes ont un code entier différent
-
mais : |int(d)| = |d| donc |id| =|d|
s = 'paul.poitevin@centrale-marseille.fr'
d = bytes(s, 'ascii')
id = int.from_bytes(d, byteorder='big')
print("id =", idDonne :
id = 852806586114976881510056778471769180697471859150728801241505293627173168229624211058!! viole le principe de compacité
Etape 2 : réduction du code
Soit i = int(d):
Méthode 1 : le modulo r (reste de la division entière par r)
id = H(i) = i mod r
Avantage :
- code borné entre 0 et r
- |id|<<|d| dans le cas général
Inconvénient:
-
deux données proches ou très similaires auront un index proche ou similaire : si j = i + 1, H(j) = H(i) + 1 (presque toujours)
-
ce codage revient à sélectionner les bits de poids faible
-
deux données différentes peuvent avoir le même code
-
—> il faut prendre r premier
Etape 2 : réduction du code
Soit i = int(d):
Méthode 2 : combiner produit et modulo – soient m et n deux nombres premiers entre eux:
-
k = H(i) = (i * m) mod n
-
Avantage :
-
|k|<<|d|
-
deux entiers proches donneront auront des codes très différents : si j = i + 1, j * m - i * m = m
-
-
Inconvénient :
-
deux données différentes peuvent avoir le même code
-
le produit i * m peut etre coûteux à calculer
-
Etape 2 : réduction du code
Application : Table de hachage
- Soit T un tableau de données statique de taille n
- Soit H une fonction de hachage à valeurs sur [0, n-1]
- La fonction de hachage est utilisée comme fonction d'adressage :
- d --> id(d) = H(d)
- id(d) = ref(d) est l'adresse utilisée pour stocker d dans le tableau!
- Avantage :
- Pas besoin de maintenir un index
- Recherche/Insertion/Suppression en 0(1)
- Inconvénient :
- stockage non dense : nécessite une table d'allocation
- risque de collision
- unicité d --> id : presque OK !!
- intégrité id --> d : OK
Application : Table de hachage dynamique
On commence par créer un tableau de taille n = 1, le nombre initial d'éléments étant m = 0
-
A chaque ajout d'un élément d : id <-- H(d)
-
si T[id] n'est pas occupé,
-
ajouter l'élément à la position id
-
-
sinon :
-
si T[id] != d
-
allouer un tableau à 2 * n éléments et n ← n * 2
-
copier les m premiers éléments du tableau initial dans le nouveau tableau & supprimer le tableau initial.
-
répéter l'opération si nécessaire jusqu'à pouvoir ajouter l'élément d à la position H(d)
-
-
-
- unicité d --> id : OK !!
- intégrité id --> d : OK
Application : structure d'ensemble dynamique
- Définition : un ensemble dynamique est une structure de données proposant les fonctionnalités suivantes:
- Il existe un ensemble vide
- Il existe une fonction permettant de tester l'appartenance d'un élément d à l'ensemble
- il est possible d'ajouter et de retirer des éléments de l'ensemble
- ajouter d à un ensemble le contenant déjà est sans effet
- retirer d d'un ensemble ne le contenant pas est sans effet
- La table de hachage dynamique permet d'implémenter une telle structure d'ensemble
Application : le dictionnaire
- Définition : un dictionnaire est un index:
- Autrement dit est un ensemble dynamique de couples (id:d) où:
-
- id est l'identifiant
- d est la donnée associée à la clé
- respectant la contrainte d'intégrité uniquement (à tout identifiant est associée une donnée unique)
-
- Au lieu de la liste, l'index est une table de hachage dynamique sur les identifiants:
- id --> H(id) --> T[H(id)] --> d
- T[H(id)] référence la donnée en mémoire
- Insertion/recherche/suppression en O(1)!
- Au lieu de la liste, l'index est une table de hachage dynamique sur les identifiants:
Application : le dictionnaire
id
H(id)
d
unicité
intégrité
intégrité
M E M O I R E
H - S E T
Exemple : le dictionnaire Python
- Dictionnaire vide :
dict = {}- Initialisation :
commande = {'entree': 2, 'plat': 4, 'dessert': 2, 'café': 1}- Ajout / modification :
commande['aperitif'] = 3
commande['café'] += 1- Suppression :
del commande['entree'] - Test :
if 'café' in commande :
commande['café'] += 1
else:
commande['café'] = 1Exemple : le dictionnaire Python
Le dictionnaire Python est une structure de données extrêmement flexible et expressive:
- structures d'arbres et hiérarchies,
- compteurs,
- etc.
arbre = {val : 12,
gauche: {val:6,
gauche:None,
droit:None},
droit: {val:15,
gauche:None,
droit:None}}
}promo2022 = {'demi promo A' :
{
'TD1' : 26,
'TD2' : 25,
...
},
'demi promo B' :
{
'TD6' : 27,
'TD7' : 25,
...
}
}4.3 Les fichiers
Volume
-
Le volume est le support sur lequel sont enregistrées les données.
-
On parle de mémoire secondaire (Disque dur, disquette,CD-ROM, etc…).
-
Un volume est divisé en pistes concentriques numérotées de 0 à n ( par ex n = 1024).
-
Chaque piste supporte plusieurs enregistrements physiques appelés secteurs, de taille constante (1 secteur = 1 page).
Page (ou secteur)
-
Les pages sont les unités de base pour la lecture et l'écriture.
-
une page est une zone contiguë de la mémoire secondaire qui peut être chargée en mémoire centrale en une opération de lecture.
-
Taille standard : une page = 1-2 ko.
-
La mémoire secondaire est donc organisée comme un tableau de pages : (T[0],…,T[n-1]),
-
où n est le nombre de pages.
-
Chaque page fait m octets.
-
Chaque page peut être libre ou occupée (allocation).
-
Système d'exploitation et Fichiers
-
La mémoire secondaire n’est pas directement accessible (les programmes n’ont pas la possibilité d’aller écrire directement sur le disque).
-
La gestion des fichiers est une des fonctions essentielles des systèmes d’exploitation :
-
possibilité de traiter et conserver des quantités importantes de données
-
possibilité de partager des données entre plusieurs programmes.
-
Fichiers
A retenir :
-
Un fichier est une référence vers un ou plusieurs blocs de données, enregistrés sur un support physique.
-
Un fichier est caractérisé par son descripteur, constitué de
-
son nom,
-
son chemin d’accès,
-
ses droits d’accès (lecture/écriture/exécution) selon les utilisateurs,
-
sa position sur le support,
-
sa taille, etc…
-
Accès aux données
-
Le système d’exploitation assure ainsi l’indépendance du programme par rapport à l’emplacement des données, au travers d’instructions d’entrée/sortie spécialisées:
-
ouverture : initialisation d'un flux en lecture ou en écriture
-
lecture : consultation des lignes l'une après l'autre (à partir de la première ligne), dans l'ordre où elles ont été écrites sur le support
-
écriture : ajout de nouvelles données à la suite ou en remplacement des données existantes
-
Répertoires
- Tous les descripteurs de fichiers sont regroupés dans une table des matières appelée Répertoire (Directory)
-
Organisation hiérarchique :
-
Lorsque le nombre de fichiers est élevé, les descripteurs de fichiers sont classés dans plusieurs répertoires, organisés sous une forme arborescente.
-
Le répertoire de plus bas niveau hiérarchique est appelé racine
-
→ chemin d’accès (path)
-

Consultation des données : ouverture en lecture (Read)
try :
f = open('/chemin/vers/mon/fichier.dat','r')
except IOError:
print "Erreur d'ouverture!"Lorsque l’opération d’ouverture est réalisée avec succès,
- le flux de données devient accessible en lecture
- les premières lignes du fichier sont chargées en mémoire et une tête de lecture se positionne sur le premier caractère de la première ligne
- Il ne reste plus qu’à lire les données.
Consultation des données : lecture des données (Read)
- Lecture d'une ligne unique (readline)
- Lecture de toutes les lignes (la lecture s’effectue dans une boucle) + affichage de la ligne:
s = f.readline()for s in f :
print sMise à jour: ouverture en écriture (Write)
try :
f = open('/chemin/vers/mon/fichier.dat','w')
except IOError:
print "Erreur d'ouverture!"Lorsque l’opération d’ouverture est réalisée avec succès,
- le flux de données devient accessible en écriture
- Il ne reste plus qu’à écrire les données.
Mise à jour: ouverture en écriture (Write)
- Ecriture d'un texte:
- Lecture de toutes les lignes (la lecture s’effectue dans une boucle) + affichage de la ligne:
f.write("Commande enregistrée:")for k in commande:
f.write(k + ':' + str(commande(k)))Tronc commun 1A
By Emmanuel Dauce
Tronc commun 1A
- 1,819