Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2007
    Messages : 22
    Points : 16
    Points
    16

    Par défaut Ajouter une ligne en début de fichier

    Bonjour, je souhaite parcourir un grand nombre de fichiers textes afin de leur ajouter une ligne en début de fichier. Il semble possible d'ouvrir un fichier en mode a afin d'ajouter des lignes en fin de fichier mais je n'ai pas trouvé de solution pour faire la même chose en début de fichier. Il y a-t-il une solution simple ou faut-il créer un nouveau fichier, écrire sa première ligne et ensuite recopier tout le reste du fichier initial ?

    Cordialement,
    MB.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 222
    Points : 286
    Points
    286

    Par défaut

    Bonjour,
    Je ne crois que tu puisses ajouter une ligne en début de fichier en mode "ajout". Je pense qu'il va falloir procéder en 2 étapes. Voilà une méthode, si tes fichiers ne sont pas trop volumineux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fileR = open("file.txt", "r")
    text = fileR.read()
    fileR.close()
     
    textInsert = "Text a inserer\n"
     
    fileW = open("file.txt", "w")
    fileW.write(textInsert + text)
     
    fileW.close()

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 418
    Points : 1 651
    Points
    1 651

    Par défaut

    Bonjour,


    D'un point de vue logique, un fichier est une succession linéaire d'octets.
    Matériellement, sur un disque dur ces octets se trouvent sur des pistes circulaires concentriques, et un fichier peut être fragmenté en plusieurs morceaux.
    Mais d'un point de vue logique on peut se les représenter se succédant sur une seule piste en spirale comme une piste de CD, le contrôleur d'accès matériel au disque et le SGF (système de gestion des fichiers) du système d'exploitation étant chargés de faire le lien entre l'organisation physique d'un fichier et sa structure logique.

    Avant le début physique d'un fichier, il y a d'autres octets qui sont ceux de la fin d'un autre fichier. J'ai l'habitude de dire concernant ces problèmes d'insertion de données dans un fichier existant qu'on ne peut pas écarter les octets magnétiques pour en bourrer des supplémentaires entre deux positions. Il faut nécessairement opérer un déplacement physique des autres octets pour libérer de la place. Et donc pour ton objectif, et plus généralement celui de toute insertion de données sans remplacement de données existantes, il n'y a pas d'autre solution que de passer par une recopie de fichier.





    Concrètement il y a cependant deux cas.



    Soit le fichier est d'une taille modérée ne posant pas de difficulté pour opérer la recopie d'une manière simple, c'est à dire

    - soit en chargeant temporairement la totalité du fichier dans la RAM avant d'effacer l'ancien fichier et de réinjecter dans un nouveau fichier.
    C'est le code proposé par nyko77, sauf qu'il ne délète pas l'ancien fichier avant de créer le nouveau.

    Le point critique étant que la RAM doit pouvoir absorber la taille du fichier en entier (et si ce n'est pas le cas, il va y avoir sollicitation du disque dur pour accueillir une partie des données dans le fichier d'échange, ce qui ramène au cas suivant)

    Si on n'efface pas le fichier ancien avant de créer le nouveau, il faut aussi que le disque dur soit capable d'abriter deux fichiers de même taille en même temps.

    - soit en faisant la même chose mais par morceaux, si la RAM est insuffisante; le point essentiel étant alors que le disque dur doit avoir une capacité suffisante pour héberger, même pendant un court moment, deux fichiers de taille similaires puisque l'un est grosso modo la recopie de l'autre + l'insertion (point identique au cas vu plus haut)




    Soit le fichier est très gros et il faut alors recourir à des manipulations plus précises qui passent nécessairement par du traitement par morceaux:

    - soit en ouvrant-refermant sans cesse le fichier de départ pour en copier des morceaux et les effacer au fur et à mesure qu'on les recopie dans un nouveau fichier

    - soit en n'ouvrant que le fichier à recopier et en recopiant le fichier sur lui-même par morceaux que l'on déplace, mais d'une façon sioux pour éviter d'effacer des données avant qu'elles aient été déplacees-recopiées.






    Pour être un peu plus technique,
    le mode 'a' est un mode qui ne permet que de faire un ajout à la fin d'un fichier, c'est un mode de protection des données
    cf cette instructive page indiquée récemment par dividee:
    http://msdn.microsoft.com/en-us/library/yeby3zcb(VS.71).aspx

    Pour faire des manipulations sur un fichier en se promenant à l'intérieur au moyen des fonctions seek() et tell() , il faut l'ouvrir en mode 'r+'.
    Et pour maitriser les choses de façon tout à fait précise il faut l'ouvrir en mode binaire --> mode 'r+b' , ou 'rb+' c'est pareil.
    Voir pourquoi ici:
    http://www.developpez.net/forums/d892596/autres-langages/python-zope/general-python/python-ne-voit-format-windows/#post5070419

    Le mode 'r+' et 'r+b' permettent de tout faire: lire, écrire en fin de fichier, écrire en écrasant les données existantes en milieu de fichier.




    Pour voir des exemples concrets de manipulation de fichier, bien qu'il s'agisse en l'occurence d'éliminer des lignes dans un fichier, cf les deux posts suivants
    http://www.developpez.net/forums/d883673/autres-langages/python-zope/general-python/effacement-ligne-fichier-python/#post5025287
    et
    http://www.developpez.net/forums/d883673/autres-langages/python-zope/general-python/effacement-ligne-fichier-python/#post5025375

    J'en ai commis d'autres du même style mais je ne sais plus lesquels, je n'ai pas leurs lien sous la main.





    On peut envisager pour ton cas divers algorithmes de recopie par déplacement dans le même fichier s'il est très gros, soit en commençant par la fin, soit en commençant par le début du fichier.

    Peux tu donner la taille des fichiers que tu comptes modifier et donner la capacité de ta RAM et l'espace libre sur ton disque dur.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2007
    Messages : 22
    Points : 16
    Points
    16

    Par défaut

    Merci pour vos réponses.

    Je constate donc qu'il n'y a pas de méthode 'directe' (car même si il faut nécessairement déplacer les octets pour en insérer d'autres, python aurait pu proposer une commande pour le faire sans le dire) pour ajouter une ligne en début de fichier et qu'il faut passer par une copie du contenu. En ce qui me concerne, il n'y aura pas de problème au niveau de la ram puisque les fichiers sont nombreux mais de petite taille (moins de 500ko).

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 418
    Points : 1 651
    Points
    1 651

    Par défaut

    python aurait pu proposer une commande pour le faire sans le dire
    L'existence d'un mode 'i' pour l'ouverture de fichier en quelque sorte , un mode symétrique du mode 'a' qui ne pourrait qu'ajouter en début de fichier ?

    - Python étant implémenté en langage C, il recourt aux fonctions et aux modes d'ouverture des fichiers qui sont disponibles en C et je ne crois pas qu'il existe un tel mode en C

    - Étant donnés les problèmes liés à l'insertion logique de données dans un fichier, je pense qu'il ne serait pas très bon que les développeurs aient facilité à ne pas s'intéresser aux détails de ces problèmes

    - Vus la diversité de cas de figures potentielles, je pense qu'établir un algorithme d'insertion automatique de données en début d'un fichier, impliquant des caractéristiques matérielles, ne doit pas être une mince affaire.

Discussions similaires

  1. Ajout d'une ligne en début de fichier CSV
    Par dbtn89 dans le forum Débuter
    Réponses: 13
    Dernier message: 12/05/2015, 19h52
  2. Réponses: 2
    Dernier message: 21/10/2008, 10h46
  3. Ecrire une ligne au début du fichier existant
    Par squalito dans le forum VBScript
    Réponses: 1
    Dernier message: 17/07/2008, 23h37
  4. ajouter une ligne en debut de fichier
    Par kespy13 dans le forum Langage
    Réponses: 7
    Dernier message: 15/05/2008, 14h27
  5. Réponses: 10
    Dernier message: 05/04/2007, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo