Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tc_info:cm2 [2018/09/25 12:56] – [CM2 : Données et fichiers] edauce | tc_info:cm2 [2018/11/19 23:17] (Version actuelle) – edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ==== CM2 : Données et fichiers ==== | ||
+ | |||
+ | |||
+ | |||
+ | Les données numériques sont une des composantes essentielles des programmes informatiques. | ||
+ | * Il s'agit par définition des // | ||
+ | * Avec l’augmentation des capacités de stockage et leur mise en réseau, les quantités de données conservées ont considérablement augmenté au cours des dernières décennies. | ||
+ | |||
+ | Dans le cadre de ce cours, nous aborderons : | ||
+ | * la question du stockage de ces données sur un support informatique (Fichiers, bases de données), | ||
+ | * ainsi que les méthodes permettant de consulter et mettre à jour régulièrement ces données. | ||
+ | |||
+ | ===== 1. Généralités ===== | ||
+ | |||
+ | ==== 1.1 Production des données ==== | ||
+ | |||
+ | Tout commence par une fiche à remplir… | ||
+ | |||
+ | {{https:// | ||
+ | |||
+ | * 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. | ||
+ | |||
+ | <note tip> | ||
+ | Un jeu de valeurs sert à décrire : | ||
+ | * une personne réelle : assuré, client, étudiant, auteur, plaignant, contribuable, | ||
+ | * une personne morale : fournisseur, | ||
+ | * un objet physique : article, véhicule, composant, ingrédient, | ||
+ | * un objet contractuel ou administratif : fiche de paye, contrat, procès verbal, billet, dossier... | ||
+ | * un lieu : salle, local, manufacture, | ||
+ | * un événement : transaction, | ||
+ | * etc... | ||
+ | </ | ||
+ | |||
+ | ==== 1.2 Stockage des données ==== | ||
+ | |||
+ | * D’un point de vue informatique, | ||
+ | * 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. | ||
+ | |||
+ | <note tip> | ||
+ | Exemples de structures de données (cours d' | ||
+ | * listes, | ||
+ | * listes de listes, | ||
+ | * dictionnaires, | ||
+ | * arbres,... | ||
+ | </ | ||
+ | |||
+ | * Mais l’encodage comprend également et principalement 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...). | ||
+ | |||
+ | ==== 1.3 Requêtes ==== | ||
+ | |||
+ | En informatique, | ||
+ | * Le programme **client** représente l’utilisateur, | ||
+ | * Les données sont centralisées au niveau du **serveur**, | ||
+ | |||
+ | <note tip> | ||
+ | {{public: | ||
+ | </ | ||
+ | |||
+ | La requête peut être une simple référence vers un fichier, ou être 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 [[public: | ||
+ | |||
+ | On distingue quatre grands types de requêtes (approche “CRUD”): | ||
+ | * **Création** (// | ||
+ | * **Lecture/ | ||
+ | * **Mise à jour** (// | ||
+ | * **Suppression** (// | ||
+ | |||
+ | Lors d’une consultation de type lecture/ | ||
+ | |||
+ | <note tip> | ||
+ | __Exemples :__ | ||
+ | * requêtes http : demande de consultation d’une page web ( = 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 : | ||
+ | <code sql> | ||
+ | SELECT * | ||
+ | FROM Eleves | ||
+ | WHERE NOM = ' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ==== 1.4 Transport et flux de 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). | ||
+ | * 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**. | ||
+ | <note tip> | ||
+ | La notion de flux de données signifie que les réponses sont lues dans un ordre fixe, telles qu’elles ont été écrites au niveau du serveur. On parle de lecture à accès **séquentiel** (par opposition à la lecture à accès aléatoire). | ||
+ | </ | ||
+ | |||
+ | ==== 1.5 Analyse des données ==== | ||
+ | |||
+ | L’analyse des données a pour but de recomposer l’information contenue dans les données recueillies afin d’en fournir une vue plus synthétique, | ||
+ | |||
+ | **REPRESENTATION DES DONNEES** : Représenter des jeux de valeurs de grande taille de façon plus synthétique (algorithmes de réduction de dimension) | ||
+ | |||
+ | **REGROUPEMENT (“CLUSTERING”)** : Définir des regroupements (ou des classements simples ou hiérarchiques) entre jeux de valeurs | ||
+ | |||
+ | **COMPLETION** : Méthodes de classification automatique (ou d’interpolation) visant à deviner soit la classe, soit certaines valeurs non mesurées, | ||
+ | |||
+ | **ESTIMATION ET DECISION** : Méthodes visant à estimer la “valeur” associée à un jeu de données (pour l’aide à la décision) | ||
+ | |||
+ | ===== 2. Données et fichiers ===== | ||
+ | |||
+ | ====2.1 Types de données==== | ||
+ | |||
+ | On distingue classiquement deux grandes catégories 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/ | ||
+ | * de type texte (autrement dit “chaine de caractères”). ex: nom, prénom, ville,... | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | Parfois, la distinction entre quantitatif et qualitatif n’est pas nette: | ||
+ | * Possibilité d’ordonner les chaînes de caractères (de type nom/ | ||
+ | * On peut “traduire” une chaîne de caractères en entier (son code ASCII) | ||
+ | * Les valeurs logiques vrai/faux sont souvent traduites en valeurs “entières” 1/0 | ||
+ | * Plus subtil : il est possible de définir des ordres partiels, des hiérarchies sur des données qualitatives : | ||
+ | * regroupement par secteur géographique | ||
+ | * notion de distance (géographique et temporelle) entre catégories | ||
+ | * Inversement, | ||
+ | </ | ||
+ | |||
+ | ====2.2 Représentation informatique des données==== | ||
+ | <note important> | ||
+ | D'un point de vue informatique, | ||
+ | |||
+ | 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) | ||
+ | </ | ||
+ | |||
+ | * 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, | ||
+ | |||
+ | < | ||
+ | **Types de données standards** | ||
+ | |||
+ | Les principaux types de données SQL sont les suivants : | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | </ | ||
+ | |||
+ | ==== 2.3 Structures de données ==== | ||
+ | * Les types des valeurs étant déterminés (selon les cas de taille fixe ou variable), | ||
+ | * la **structure de données** correspond au “véhicule” qui servira à transporter et échanger les données (entre programmes, entre ordinateurs). | ||
+ | * Différentes structures de données sont possibles pour l’encodage et le stockage d’un jeu de valeurs, voir : | ||
+ | * Données non structurées | ||
+ | * Données vectorielles | ||
+ | * Tuples | ||
+ | * Données structurées | ||
+ | * Données Hiérarchisées | ||
+ | |||
+ | Le Tuple est la structure de données de base servant pour le recueil, le transport et le stockage des données. | ||
+ | |||
+ | <note important> | ||
+ | * Un **Tuple** est une liste, **finie**, **ordonnée** et **de taille fixe** contenant une suite de valeurs. | ||
+ | * Chaque valeur peut obéir à un format différent | ||
+ | * On note //m// la taille du tuple (nombre de valeurs) | ||
+ | t=(a1,...,am) | ||
+ | **Exemple :** | ||
+ | (" | ||
+ | </ | ||
+ | |||
+ | === 2.3.1 Données non structurées=== | ||
+ | *Textes, | ||
+ | *comptes rendus, | ||
+ | *série de notes, de valeurs sans format précis : | ||
+ | --> format texte en général. | ||
+ | |||
+ | < | ||
+ | Le format '' | ||
+ | * ASCII (caractères sans accent), | ||
+ | * utf8 (caractères accentués et spéciaux), | ||
+ | * ... | ||
+ | </ | ||
+ | |||
+ | === 2.3.2 Données vectorielles=== | ||
+ | * Chaque jeu de valeurs est codé sous la forme d’un **vecteur** | ||
+ | * constitué de grandeurs entières ou réelles : | ||
+ | * toutes les valeurs sont quantitatives (numériques). | ||
+ | * C’est un encodage adapté aux grandeurs physiques : | ||
+ | * chaque champ du formulaire est codé dans un format numérique | ||
+ | * il est possible de représenter les données dans un espace vectoriel | ||
+ | |||
+ | <note important> | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | **Exemple** : | ||
+ | Considérons une station météorologique enregistrant à intervalle réguliers les données de ses capteurs : | ||
+ | * thermomètre, | ||
+ | * baromètre, | ||
+ | * hygromètre | ||
+ | * et anémomètre. | ||
+ | Un jeu de valeurs sera constitué de //5 réels double précision// | ||
+ | * la température, | ||
+ | * la pression, | ||
+ | * l’humidité, | ||
+ | * la vitesse | ||
+ | * et la direction du vent. | ||
+ | </ | ||
+ | |||
+ | === 2.3.3 Tuples=== | ||
+ | Données organisées sous la forme d’une liste de valeurs qualitatives ou quantitatives. Le tuple est la structure de base servant pour la transmission des données (simple, facile à coder et à échanger). | ||
+ | |||
+ | <note important> | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | **Exemple** : considérons une fiche servant à décrire un étudiant. L’étudiant doit remplir les rubriques nom, prénom et âge, numero de voie, nom de la voie, code postal, ville. Chaque rubrique correspond à un composant d’un 7-tuplet tel que: | ||
+ | * les composants 1, 2, 5 et 7 sont des chaînes de caractères | ||
+ | * les composants 3, 4 et 6 sont des entiers | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | **Le format csv - “Comma Separated Values” ** | ||
+ | |||
+ | Chaque enregistrement est codé sur une ligne, chaque valeur étant séparé par un caractère séparateur (virgule, point-virgule, | ||
+ | |||
+ | Exemple : | ||
+ | Dubois, | ||
+ | |||
+ | Remarques : | ||
+ | * les données sont des chaînes de caractères | ||
+ | * les guillemets sont nécessaires lorsque la valeur contient le caractère séparateur (ici la virgule) | ||
+ | * les noms des attributs sont éventuellement indiqué sur une ligne séparée | ||
+ | </ | ||
+ | |||
+ | |||
+ | === 2.3.4 Données structurées=== | ||
+ | * Données organisées sous la forme d’une liste d’attributs. | ||
+ | * Chaque attribut est défini par un nom et un format (**type**). | ||
+ | * Chaque valeur est stockée sous la forme d’un couple (attribut : **valeur**). | ||
+ | |||
+ | <note tip> | ||
+ | **Exemple** : | ||
+ | |||
+ | Considérons une fiche servant à décrire un étudiant. L’étudiant doit remplir les rubriques nom, prénom et âge, numero de voie, nom de la voie, code postal, ville. | ||
+ | |||
+ | Chaque rubrique correspond à un attribut, où: | ||
+ | * nom, prenom, voie, et ville sont des attributs de type chaîne de caractères | ||
+ | * age et numero et code_postal sont des attributs de type entier | ||
+ | |||
+ | La structure de données sous-jacente est le **dictionnaire**, | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | Un **dictionnaire** est une liste non ordonnée de valeurs, chaque valeur étant associée à une clé unique (ici la clé est le nom de l’attribut). | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | **Le format json - JavaScript Object Notation** | ||
+ | |||
+ | Exemple : | ||
+ | {" | ||
+ | |||
+ | Remarques : | ||
+ | * reprend la syntaxe vue en Python | ||
+ | * données numériques ou chaînes de caractères | ||
+ | </ | ||
+ | |||
+ | |||
+ | === 2.3.5 Données Hiérarchisées=== | ||
+ | |||
+ | * Organisation des données correspondant à une structure d’**arbre**. | ||
+ | * Dans le cas d’un recueil de données, correspond à la définition de rubriques et sous-rubriques. | ||
+ | |||
+ | <note tip> | ||
+ | **Exemples** : | ||
+ | * La rubrique **adresse** peut contenir les sous-rubriques **numero**, **voie**, **code_postal** et **ville**. | ||
+ | * Un document contient des **chapitres**, | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | Pour les données organisées de manière hiérarchique. Des balises servent à séparer les différents attributs. | ||
+ | |||
+ | Ex : | ||
+ | |||
+ | <nom> Dubois </ | ||
+ | < | ||
+ | < | ||
+ | <num> 28 </ | ||
+ | < | ||
+ | <code postal> 45000 </code postal> | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | |||
+ | remarque : le format '' | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====2.4 Structures de stockage==== | ||
+ | |||
+ | === 2.4.1 Trames de données === | ||
+ | Un jeu de valeurs encodé et stocké sur un support informatique est appelé un “**enregistrement**”. Un enregistrement, | ||
+ | |||
+ | * Les **trames de données** servent au **transport** et à la **conservation** des tuples. | ||
+ | * Une trame peut obéir à un format //textuel// ou //binaire// | ||
+ | |||
+ | < | ||
+ | {{https:// | ||
+ | </ | ||
+ | |||
+ | === 2.4.2 Blocs de données === | ||
+ | |||
+ | Une série d’enregistrements obéit formellement à une structure de type **liste de tuples** (ou ensemble de tuples), chaque élément de la liste étant un tuple particulier. | ||
+ | |||
+ | * Les blocs de données servent à la conservation des données sur les supports de stockage | ||
+ | * Un bloc de données est un tableau (de taille fixe //n//) contenant des tuples. | ||
+ | |||
+ | < | ||
+ | {{https:// | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | Nous verrons dans un autre chapitre une description plus formelle d’une série d’enregistrements comme “ensemble d’entités” ou encore “relation”. | ||
+ | |||
+ | La difficulté consiste à définir une structure de données permettant de gérer efficacement un tel ensemble (qui peut être de grande taille) stocké sur un disque dur. On parle de structure de stockage. Une telle structure doit permettre : | ||
+ | d’ajouter des tuples | ||
+ | de supprimer des tuples | ||
+ | d’accéder rapidement à un tuple particulier (pour lire son contenu) | ||
+ | |||
+ | === 2.4.3 Stockage d’un jeu de valeurs=== | ||
+ | |||
+ | **Encodage binaire :** | ||
+ | |||
+ | * Définition d’une trame, en général de taille fixe. | ||
+ | * Chaque rubrique occupe un nombre d’octets déterminé, | ||
+ | * L’utilisation de trames de taille fixe facilite le stockage et la conservation des données sur les supports magnétiques (disque dur, etc...) | ||
+ | * Les données sont transmises dans un format numérique (type) identique à celui utilisé en mémoire centrale. | ||
+ | |||
+ | **Encodage textuel :** | ||
+ | |||
+ | * Le jeu de données est codé dans un format descriptif (contenant à la fois les valeurs et une description des données : types, attributs, ...). | ||
+ | * Ce format facilite la transmission d’un programme à un autre (format “plat”) mais est moins propice au stockage. | ||
+ | * La “sérialisation” est l’opération qui consiste à encoder des données sous la forme d’un texte brut (codage ASCII ou utf8), en “perdant” le moins possible d’information. | ||
+ | * Des exemples de formats textes standards sont donnés en [[public: | ||
+ | |||
+ | === 2.4.5 Stockage d’une séries d’enregistrements=== | ||
+ | La structure de base servant à stocker à une série d’enregistrements est le tableau de données à 2 dimensions : | ||
+ | |||
+ | * Tableau de données (data frame) = intitulé de colonnes + liste de lignes | ||
+ | * Intitulé de colonne = nom de l’attribut | ||
+ | * une ligne = un tuple | ||
+ | |||
+ | Propriété : | ||
+ | * les tuples sont implicitement ordonnées selon leur numéro de ligne | ||
+ | * il peut y avoir des doublons | ||
+ | |||
+ | Structure sous-jacente : tableau à 2 dimensions (ou matrice de données) | ||
+ | |||
+ | Inconvénient: | ||
+ | |||
+ | <note tip> | ||
+ | Les structures de stockage utilisées en pratique sont beaucoup plus sophistiquées et permettent de gérer l’insertion et la suppression de tuples sans déplacer les autres tuples. Ce type de stockage repose sur un découpage d’un tableau de données en “pages” et sur l’indexation des tuples (recherche par “clé”). La complexité de cette gestion est en général laissée à un programme spécialisé (tableur, système de gestion de bases de données). | ||
+ | </ | ||
+ | |||
+ | === 2.4.6 Stockage sur fichier=== | ||
+ | Les lignes d’une table correspondent physiquement à des enregistrements (ou tuples). Les tuples sont rangés dans des fichiers, stockés sur le disque dur. | ||
+ | |||
+ | Pourquoi stockées sur le disque dur? | ||
+ | * volume très important des données | ||
+ | * les données doivent survivre à un arrêt du serveur | ||
+ | |||
+ | ==Volume== | ||
+ | Le volume est le support sur lequel sont enregistrées les données. On parle de mémoire secondaire (Disque dur, disquette, | ||
+ | |||
+ | |||
+ | |||
+ | ==Page (ou secteur)== | ||
+ | Les pages sont les unités de base pour la lecture et l' | ||
+ | |||
+ | La mémoire secondaire est donc organisée comme un tableau de pages : (T[0], | ||
+ | |||
+ | ====2.5 Fichiers et répertoires==== | ||
+ | |||
+ | La mémoire secondaire n’est pas directement accessible (les programmes n’ont pas la possibilité d’aller écrire directement sur le disque). 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/ | ||
+ | Pour que les programmes puissent écrire sur le disque, on introduit des objets intermédiaires : les fichiers. | ||
+ | |||
+ | <note important> | ||
+ | **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, | ||
+ | </ | ||
+ | |||
+ | * 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. | ||
+ | |||
+ | <note tip> | ||
+ | ** Opérations de base ** : | ||
+ | * // | ||
+ | * //Lecture// : consultation des lignes l'une après l' | ||
+ | * // | ||
+ | </ | ||
+ | |||
+ | ** Répertoires ** | ||
+ | Chaque volume possède un numéro appelé le label du volume. | ||
+ | Tous les descripteurs de fichiers sont regroupés dans une table des matières appelée Répertoire (Directory). | ||
+ | |||
+ | Remarque : cette table des matières est en fait un fichier dont le descripteur est contenu dans le label du volume. | ||
+ | |||
+ | **Organisation hiérarchique :** | ||
+ | * Lorsque le nombre de fichiers est élevé, les descripteurs de fichiers sont classés dans plusieurs répertoires, | ||
+ | * Le répertoire de plus bas niveau hiérarchique est appelé racine → chemin d’accès (path) | ||
+ | |||
+ | === 2.5.1 Consultation des données : lecture d’un fichier (Read)=== | ||
+ | Méthode traditionnelle pour le traitement de fichiers de petite taille. La consultation des données nécessite d’ouvrir une “communication” entre le programme et les fichiers. Ce canal de communication permet de recevoir un flux de données. | ||
+ | |||
+ | Pour établir la communication, | ||
+ | le “chemin d’accès” aux données (disque dur local) | ||
+ | l’”adresse” des données (lorsqu’il s’agit de données stockées sur un serveur distant) | ||
+ | |||
+ | L’opération d’ouverture de fichier initialise un descripteur de fichier, qui sert à désigner (dans le programme) le fichier sur lequel on travaille, et d’accéder au contenu du flux. | ||
+ | |||
+ | Ouverture simple: | ||
+ | |||
+ | <note tip> **Python** | ||
+ | |||
+ | f = open(' | ||
+ | |||
+ | Le deuxième argument représente le mode d’ouverture, | ||
+ | </ | ||
+ | |||
+ | <note tip> **Java** | ||
+ | |||
+ | FileReader d = new FileReader (" | ||
+ | BufferedReader f = new BufferedReader(d); | ||
+ | |||
+ | |||
+ | |||
+ | Nous utilisons ici comme descripteur un objet de type BufferedReader signifiant explicitement que les données sont chargées en mémoire tampon (le “buffer”). Les objets FileReader et BufferedReader sont définis dans la librairie '' | ||
+ | import java.io.*; | ||
+ | </ | ||
+ | |||
+ | ==Ouverture avec test : == | ||
+ | Il est important de vérifier que cette opération d’ouverture s’effectue correctement avant de poursuivre le programme (nombreuses possibilités d’erreur : fichier effacé, erreur de nom, pas de droits de lecture, | ||
+ | On utilise une instruction de test spécifique pour vérifier que l’ouverture du fichier s’est correctement effectuée, de type '' | ||
+ | |||
+ | <note tip> | ||
+ | **Python** | ||
+ | |||
+ | try : | ||
+ | f = open(' | ||
+ | except IOError: | ||
+ | print " | ||
+ | </ | ||
+ | |||
+ | <note tip> **Java** | ||
+ | |||
+ | try{ | ||
+ | FileReader d = new FileReader (" | ||
+ | BufferedReader f = new BufferedReader(d); | ||
+ | } | ||
+ | catch (Exception e){ | ||
+ | System.out.println(" | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | La consultation des données s’effectue séquentiellement à l’aide de l’opérateur de lecture '' | ||
+ | |||
+ | Si on suppose que les données sont rangées sous la forme d’une série de tuples, chaque opération de lecture consiste à consulter un tuple, et à positionner la tête de lecture sur le tuple suivant. | ||
+ | |||
+ | <note tip> | ||
+ | **Exemples :** lecture de données texte : chaque opération de lecture lit tous les caractères jusqu’au caractère “fin de ligne”. | ||
+ | |||
+ | __ 1. Lecture d’une ligne unique :__ | ||
+ | |||
+ | **Python** | ||
+ | s = f.readline() | ||
+ | |||
+ | **Java** | ||
+ | s = f.readLine() | ||
+ | |||
+ | __ 2. Lecture de toutes les lignes (la lecture s’effectue dans une boucle) + affichage de la ligne:__ | ||
+ | |||
+ | **Python** | ||
+ | |||
+ | for s in f : | ||
+ | print s | ||
+ | |||
+ | **Java** | ||
+ | |||
+ | String s; | ||
+ | while ((s = f.readLine()) != null){ | ||
+ | System.out.println(s); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === 2.5.2 Enregistrement des données : sauvegarde dans un fichier (Write)=== | ||
+ | |||
+ | L’opération de sauvegarde des données est l’opération complémentaire de la lecture. De nouvelles données doivent être enregistrées sur le disque dur en vue d’une consultation future. | ||
+ | Le format de sauvegarde peut être de type texte ou de type binaire. Nous présentons ici la sauvegarde des données dans des formats texte. | ||
+ | |||
+ | Comme dans le cas de l’opération de lecture, il faut au préalable définir dans le programme un descripteur de fichier servant de point d’entrée pour les opération d’écriture. On effectue ce qu’on appelle une ouverture en mode “écriture”. | ||
+ | |||
+ | |||
+ | **Python** | ||
+ | try : | ||
+ | f = open(' | ||
+ | except IOError: | ||
+ | print " | ||
+ | | ||
+ | **Java** | ||
+ | try{ | ||
+ | FileWriter d = new FileWriter (' | ||
+ | BufferedWriter f = new BufferedWriter(d); | ||
+ | } | ||
+ | catch (Exception e){ | ||
+ | System.out.println(" | ||
+ | } | ||
+ | |||
+ | On notera qu’il existe en python (ainsi qu’en C, C++, …) plusieurs modes d’ouverture exprimés par le deuxième argument de la fonction open. On retiendra le mode ‘w’ (création d’un nouveau fichier vide) et le mode ‘a’ (ajout de nouvelles données à la suite d’un fichier déjà existant). | ||
+ | |||
+ | La sauvegarde dans le fichier s’effectue à l’aide d’un opérateur d’écriture. Dans le cas des chaînes de caractères, | ||
+ | |||
+ | |||
+ | **Python** | ||
+ | f.write(" | ||
+ | |||
+ | |||
+ | **Java** | ||
+ | f.write(" | ||
+ | |||
+ | La sauvegarde de données nécessite d’effectuer un choix sur le mode d’encodage, | ||
+ | |||
+ | Une fois les opérations de lecture ou d’écriture terminées, il est nécessaire de fermer le fichier. L’opération de fermeture assure que les données sont effectivement enregistrées sur le disque (et non simplement stockées dans la mémoire tampon | ||
+ | |||
+ | <note tip> | ||
+ | **Algorithmes de bas niveau (niveau système d’exploitation)** | ||
+ | |||
+ | Lors de la création (et mise à jour) d’un fichier, on lui alloue un espace sur le volume. Plusieurs régions peuvent être allouées pour un seul fichier) | ||
+ | La taille minimale d’une région d’allocation étant une page, la région allouée à un fichier est composée d’un nombre entier de pages consécutives. | ||
+ | |||
+ | Remarque : le volume possède une table des pages libres (table de bits : chaque bit correspond à une page. Pour allouer, on fait passer le bit de 0 à 1, et on ajoute l’adresse de la page au descripteur de fichier). Lorsque tout ou partie d’un fichier est effacé, certaines pages sont libérées et introduites dans la liste des pages libres. | ||
+ | |||
+ | // | ||
+ | |||
+ | On souhaite : | ||
+ | * minimiser le nombre de régions allouées à un fichier | ||
+ | * minimiser la distance entre deux régions successives | ||
+ | |||
+ | Stratégie par page : | ||
+ | * premier trouvé (la première page libre dans la table) | ||
+ | * meilleur choix (le plus proche de la dernière page allouée) | ||
+ | |||
+ | Stratégie par bloc: on alloue des blocs composés de plusieurs pages (S’il existe des blocs libres consécutifs, | ||
+ | * 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, | ||
+ | * 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é) | ||
+ | On alloue des blocs de 1, | ||
+ | |||
+ | Problème des stratégies par bloc: s’il y a trop de fichiers, on obtient des blocs de taille 1 --> nécessité de réorganiser (défragmenter) | ||
+ | |||
+ | // | ||
+ | |||
+ | Les opérateurs lire_ligne (readline) et écrire_ligne (write) ne travaillent pas directement sur les données du fichier. Les données du fichier sont chargées en mémoire centrale dans une mémoire “tampon”. L’objet f servant à décrire le fichier a comme attributs : | ||
+ | * t : table des pages, | ||
+ | * i : numero de la page courante, | ||
+ | * p : tableau d' | ||
+ | * j : position dans la page courante (tête de lecture). | ||
+ | |||
+ | Lors des opération de lecture, la mémoire tampon est mise à jour au fur et à mesure qu’on avance dans la lecture du fichier par des opérations de lecture sur le disque. En général, plusieurs pages sont chargées en avance. | ||
+ | Lors d’une opération d’écriture, | ||
+ | </ | ||
+ | |||
+ | **Voir aussi** : | ||
+ | * [[public: | ||