Insérer une ligne dans un fichier texte
Résolu/Fermé
bbeka
Messages postés
11
Date d'inscription
jeudi 12 avril 2012
Statut
Membre
Dernière intervention
29 mai 2012
-
16 mai 2012 à 12:55
bbeka Messages postés 11 Date d'inscription jeudi 12 avril 2012 Statut Membre Dernière intervention 29 mai 2012 - 18 mai 2012 à 10:52
bbeka Messages postés 11 Date d'inscription jeudi 12 avril 2012 Statut Membre Dernière intervention 29 mai 2012 - 18 mai 2012 à 10:52
A voir également:
- Python ajouter une ligne dans un fichier texte
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret ? ✓ - Forum Python
- Dans le texte, un seul mot a réellement été écrit en lettres capitales (majuscules). quel est ce mot ? ✓ - Forum Word
- Fichier rar - Guide
- Fichier host - Guide
- Frédéric cherche à faire le buzz sur les réseaux sociaux. il a ajouté une image de manchots sur une image de plage. retrouvez l'image originale de la plage. que cachent les manchots ? ✓ - Forum Windows
16 réponses
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
130
17 mai 2012 à 19:37
17 mai 2012 à 19:37
Pour manipuler des fichiers avec des programmes, il faut déjà bien comprendre ce qu'est physiquement un fichier, c'est à dire ce qu'est un fichier en mémoire (en RAM, sur disque dur, sur clé USB, etc)
Au niveau le plus proche du matériel, physiquement, un fichier c'est une suite de bits, une succession ininterrompue et monotone de signaux physiquement inscrits sur un support, mais qu'il n'y a rien qui corresponde physiquement à une ligne.
Ensuite à un niveau un peu au dessus matériel, il y a l'organisation conventionnelle de ces bits. Ils ne sont pas organisés de façon quelconque mais sous forme de bytes, c'est à dire d'unité adressables en mémoire.
A un niveau encore un peu au dessus, il y a la signification conventionnellement accordée à chacune des valeurs inscrites (sous forme de bits) dans les bytes.
Quand il s'agit de fichier dit texte, les valeurs des bytes codent en fait pour deux types de significations: certaines valeurs de byte codent pour des caractères, c'est à dire qu'un moteur de rendu d'affichage interprétera les bytes-caractères pour en déduire quels sortes de glyphes afficher à l'écran;
tandis que les bytes non-caractères ont d'autres significations et servent à exprimer des besoins différents de ceux de l'affichage de glyphes. Ainsi, en ASCII toutes les valeurs de bytes comprises entre 0 et 31 codent pour autre chose que des caractères.
Parmi les bytes non-caractères, il y a ceux qui ont pour rôle de signaler au moteur de rendu d'affichage qu'il faut passer à la ligne suivante: ce sont la valeur de byte symbolisée par \r et la valeur de byte symbolisée par \n.
On les représente avec un antislash parce qu'on est bien obligé de trouver un moyen de représenter par des caractères des valeurs de bytes qui ne codent pas pour des caractères.
Sous Windows, le codage des fins de lignes se fait par le groupe des deux codes \r\n accolés.
Tout ce laüs est destiné à faire comprendre qu'en ayant la notion qu'un fichier est une succession de bytes et que des lignes sont seulement un effet visuel obtenu à l'écran lors de l'affichage du fait de la présence de certaines valeurs de bytes rencontrées dans cette succession, on est plus à même d'imaginer tout seul comment on va pouvoir obtenir telle ou telle manipulation de fichier, sans devoir faire appel à d'autres personnes.
Dans ton cas, tu veux insérer quelque chose entre la première ligne et le reste des lignes. Ça, c'est la représentation intellectuelle de ce qui est voulu.
Au niveau physique, on est obligé de prendre conscience qu'on ne va pas pouvoir écarter les bits qui constituent la représentation de la première ligne et les bits qui constituent les lignes suivantes et y déposer des bits représentant l'ajout qu'on veut faire.
On va être obligé de lire et de réécrire des bytes, soit en décalant des valeurs sur des bytes proches et d'une façon qu'on va contrôler soi-même, soit on réécrit l'entièreté d'un fichier modifié et c'est le système d'exploitation qui se charge de savoir comment le faire et où mettre le nouveau fichier.
Dans le fichier initial, les bytes qui représentent la première ligne et ceux qui représentent les lignes suivantes sont séparés par le couple de bytes de valeurs \r\n.
Le point clé que je voulais ammener, c'est qu'il est plus pratique de se représenter que la première ligne est constituée de la succession de bytes jusqu'au premier couple \r\n rencontré et que les autres lignes sont la succession de bytes qui se trouvent au delà sans se préoccuper d'y distinguer des lignes.
Maintenant, au niveau de l'outil qui va permettre de faire un traitement donné sur un fichier, il est certain qu'il ne faut pas choisir d'utiliser le langage assembleur et de vouloir intervenir au niveau le plus bas, c'est à dire des bits. Ce serait monumentalement douloureux et long.
C'est pour s'affranchir de cette pénibilité qu'ont été inventés des langages d'un niveau un peu au dessus, par exemple le C.
Mais même le C est encore trop proche de la machine pour permettre de faire ce qu'on veut avec aisance. Il faut choisir un outil plus proche de l'esprit humain que le C.
Excel n'est pas un bon choix. On est contraint de l'utiliser de la manière pour laquelle il a été prévu, on ne peut pas le plier à des besoins spécifiques. Tout simplement, ce n'est pas un langage de programmation, c'est un langage de macros, pas conçu pour permettre des choses complexes.
Il faut un langage de programmation qui donne la possibilité de concrétiser en un logiciel les idées qu'on peut avoir pour obtenir tel ou tel traitement sur un fichier, compte tenu de la compréhension qu'on a de ce fichier, et sans s'enquiquiner à devoir gérer des choses au niveau matériel comme le fait le C.
Personnellement, pour cela, j'utilise Python, qui est un langage de haut niveau, c'est à dire dont l'utilisation ne nécessite pas de se préoccuper de caractéristiques liées à la machine et de la gestion des bytes.
Pour réécrire un fichier avec insertion d'un ajout entre la première ligne et le reste du fichier, il suffit en Python de faire:
Ce n'est pas la seule façon de faire mais celle-ci suffit à montrer qu'il est très simple de rédiger un programme pour faire ce que tu veux, et qu'il est très simple de le comprendre.
Tandis qu'avec Excel, il faut concevoir une macro et ça n'a pas l'air d'enthousiasmer grand monde de la faire.
Quant à sed, c'est peut être bien pour faire quelque chose de limité mais ça n'a pas l'aptitude d'être adapté pour étendre à des besoins plus complexes.
A partir du code ci-dessus , il est facile d'étendre les opérations pour obtenir un traitement automatisé de tout un réperoire, ou de tenir compte de certains critères pour différencier les actions sur des fichiers différents.
Python s'installe en moins de 10 minutes sur un ordinateur.
Au niveau le plus proche du matériel, physiquement, un fichier c'est une suite de bits, une succession ininterrompue et monotone de signaux physiquement inscrits sur un support, mais qu'il n'y a rien qui corresponde physiquement à une ligne.
Ensuite à un niveau un peu au dessus matériel, il y a l'organisation conventionnelle de ces bits. Ils ne sont pas organisés de façon quelconque mais sous forme de bytes, c'est à dire d'unité adressables en mémoire.
A un niveau encore un peu au dessus, il y a la signification conventionnellement accordée à chacune des valeurs inscrites (sous forme de bits) dans les bytes.
Quand il s'agit de fichier dit texte, les valeurs des bytes codent en fait pour deux types de significations: certaines valeurs de byte codent pour des caractères, c'est à dire qu'un moteur de rendu d'affichage interprétera les bytes-caractères pour en déduire quels sortes de glyphes afficher à l'écran;
tandis que les bytes non-caractères ont d'autres significations et servent à exprimer des besoins différents de ceux de l'affichage de glyphes. Ainsi, en ASCII toutes les valeurs de bytes comprises entre 0 et 31 codent pour autre chose que des caractères.
Parmi les bytes non-caractères, il y a ceux qui ont pour rôle de signaler au moteur de rendu d'affichage qu'il faut passer à la ligne suivante: ce sont la valeur de byte symbolisée par \r et la valeur de byte symbolisée par \n.
On les représente avec un antislash parce qu'on est bien obligé de trouver un moyen de représenter par des caractères des valeurs de bytes qui ne codent pas pour des caractères.
Sous Windows, le codage des fins de lignes se fait par le groupe des deux codes \r\n accolés.
Tout ce laüs est destiné à faire comprendre qu'en ayant la notion qu'un fichier est une succession de bytes et que des lignes sont seulement un effet visuel obtenu à l'écran lors de l'affichage du fait de la présence de certaines valeurs de bytes rencontrées dans cette succession, on est plus à même d'imaginer tout seul comment on va pouvoir obtenir telle ou telle manipulation de fichier, sans devoir faire appel à d'autres personnes.
Dans ton cas, tu veux insérer quelque chose entre la première ligne et le reste des lignes. Ça, c'est la représentation intellectuelle de ce qui est voulu.
Au niveau physique, on est obligé de prendre conscience qu'on ne va pas pouvoir écarter les bits qui constituent la représentation de la première ligne et les bits qui constituent les lignes suivantes et y déposer des bits représentant l'ajout qu'on veut faire.
On va être obligé de lire et de réécrire des bytes, soit en décalant des valeurs sur des bytes proches et d'une façon qu'on va contrôler soi-même, soit on réécrit l'entièreté d'un fichier modifié et c'est le système d'exploitation qui se charge de savoir comment le faire et où mettre le nouveau fichier.
Dans le fichier initial, les bytes qui représentent la première ligne et ceux qui représentent les lignes suivantes sont séparés par le couple de bytes de valeurs \r\n.
Le point clé que je voulais ammener, c'est qu'il est plus pratique de se représenter que la première ligne est constituée de la succession de bytes jusqu'au premier couple \r\n rencontré et que les autres lignes sont la succession de bytes qui se trouvent au delà sans se préoccuper d'y distinguer des lignes.
Maintenant, au niveau de l'outil qui va permettre de faire un traitement donné sur un fichier, il est certain qu'il ne faut pas choisir d'utiliser le langage assembleur et de vouloir intervenir au niveau le plus bas, c'est à dire des bits. Ce serait monumentalement douloureux et long.
C'est pour s'affranchir de cette pénibilité qu'ont été inventés des langages d'un niveau un peu au dessus, par exemple le C.
Mais même le C est encore trop proche de la machine pour permettre de faire ce qu'on veut avec aisance. Il faut choisir un outil plus proche de l'esprit humain que le C.
Excel n'est pas un bon choix. On est contraint de l'utiliser de la manière pour laquelle il a été prévu, on ne peut pas le plier à des besoins spécifiques. Tout simplement, ce n'est pas un langage de programmation, c'est un langage de macros, pas conçu pour permettre des choses complexes.
Il faut un langage de programmation qui donne la possibilité de concrétiser en un logiciel les idées qu'on peut avoir pour obtenir tel ou tel traitement sur un fichier, compte tenu de la compréhension qu'on a de ce fichier, et sans s'enquiquiner à devoir gérer des choses au niveau matériel comme le fait le C.
Personnellement, pour cela, j'utilise Python, qui est un langage de haut niveau, c'est à dire dont l'utilisation ne nécessite pas de se préoccuper de caractéristiques liées à la machine et de la gestion des bytes.
Pour réécrire un fichier avec insertion d'un ajout entre la première ligne et le reste du fichier, il suffit en Python de faire:
chemin_de_fichier = 'C:\\Exos Python\\metallica.txt' with open(chemin_de_fichier,'r') as fr: ch = fr.read() # p = position du premier couple d'octets de valeurs \r\n # p+2 est la position du premier octet juste après le couple \r\n p = ch.find('\r\n') + 2 with open(chemin_de_fichier,'w') as fw: fw.write(ch[0:p]) fw.write(ajout) fw.write(ch[p:])
Ce n'est pas la seule façon de faire mais celle-ci suffit à montrer qu'il est très simple de rédiger un programme pour faire ce que tu veux, et qu'il est très simple de le comprendre.
Tandis qu'avec Excel, il faut concevoir une macro et ça n'a pas l'air d'enthousiasmer grand monde de la faire.
Quant à sed, c'est peut être bien pour faire quelque chose de limité mais ça n'a pas l'aptitude d'être adapté pour étendre à des besoins plus complexes.
A partir du code ci-dessus , il est facile d'étendre les opérations pour obtenir un traitement automatisé de tout un réperoire, ou de tenir compte de certains critères pour différencier les actions sur des fichiers différents.
Python s'installe en moins de 10 minutes sur un ordinateur.