Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
730 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  [Python] Supprimer la fin d'un fichier texte

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Python] Supprimer la fin d'un fichier texte

n°1958943
Tangrim
Des bisous et des nounours !
Posté le 20-01-2010 à 10:59:17  profilanswer
 

Bonjour,
 
j'ai un petit problème en python:
je cherche à effacer toutes les lignes d'un fichier après la dernière occurence d'une chaîne de caractères (ligne où se trouve cette chaîne comprise).
Je suis en train de chercher depuis un bon moment la demarche à adopter pour réaliser ça où le module qui pourrait m'aider.
 
Merci de votre aide.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
mood
Publicité
Posté le 20-01-2010 à 10:59:17  profilanswer
 

n°1958953
olivthill
Posté le 20-01-2010 à 11:21:42  profilanswer
 

Il faut :
1. créer un nouveau fichier,  
2. copier tout l'ancien dans le nouveau sauf la fin,  
3. supprimer l'ancien fichier, et renommer le nouveau fichier pour qu'il est le nom de l'ancien.

n°1958954
masklinn
í dag viðrar vel til loftárása
Posté le 20-01-2010 à 11:24:00  profilanswer
 

Tangrim a écrit :

Bonjour,
 
j'ai un petit problème en python:
je cherche à effacer toutes les lignes d'un fichier après la dernière occurence d'une chaîne de caractères (ligne où se trouve cette chaîne comprise).
Je suis en train de chercher depuis un bon moment la demarche à adopter pour réaliser ça où le module qui pourrait m'aider.
 
Merci de votre aide.


ouvres ton fichier, passes les lignes dans itertools.takewhile, écrits les lignes sorties dans un nouveau fichier, dernière opération optionnelle supprimes le fichier d'origine et renommes le nouveau.
 

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)  
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import itertools
>>> with open('as.txt','w') as f:
...     f.writelines(itertools.takewhile(lambda line: not line.lower().startswith('b'), open('/usr/share/dict/words')))
...  
>>> ^D
 $ wc -l /usr/share/dict/words
  234936 /usr/share/dict/words
 $ wc -l as.txt  
   17061 as.txt


dans as.txt, j'ai que les mots qui commence par "a".


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1958971
Tangrim
Des bisous et des nounours !
Posté le 20-01-2010 à 11:34:44  profilanswer
 

Pour les problèmes de suppression de lignes je comptais déjà passer par quelque chose de la sorte, le problème que j'ai est de detecter la dernière occurence d'une chaîne de caractères dans le fichier.
 
Je suis en train de lire la doc de "re" mais il ne me semble pas y avoir ce que je cherche.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
n°1958977
masklinn
í dag viðrar vel til loftárása
Posté le 20-01-2010 à 11:42:51  profilanswer
 

Tangrim a écrit :

Pour les problèmes de suppression de lignes je comptais déjà passer par quelque chose de la sorte, le problème que j'ai est de detecter la dernière occurence d'une chaîne de caractères dans le fichier.


cette occurence arrive dans toutes les lignes jusqu'à ce qu'elle n'arrive plus, ou bien c'est plus pifométrique, genre elle peut arriver n'importe où?

 

Et la chaîne à checker, c'est quel genre, elle a quelle tête?


Message édité par masklinn le 20-01-2010 à 11:43:35

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1958985
Tangrim
Des bisous et des nounours !
Posté le 20-01-2010 à 12:07:51  profilanswer
 

Elle peut arriver n'importe où, et elle n'est pas dans toutes les lignes.
 
Elle ressemble à:
 
- 15:53:15 (logmount) TIMESTAMP 10/1/2010
 
Comme la chaîne "TIMESTAMP" est la seule spécifique à cette ligne, j'étais parti pour detecter le dernier TIMESTAMP du fichier et effacer cette ligne, puis tout ce qui suit.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
n°1958989
masklinn
í dag viðrar vel til loftárása
Posté le 20-01-2010 à 12:15:46  profilanswer
 

Tangrim a écrit :

Elle peut arriver n'importe où, et elle n'est pas dans toutes les lignes.
 
Elle ressemble à:
 
- 15:53:15 (logmount) TIMESTAMP 10/1/2010
 
Comme la chaîne "TIMESTAMP" est la seule spécifique à cette ligne, j'étais parti pour detecter le dernier TIMESTAMP du fichier et effacer cette ligne, puis tout ce qui suit.


La ligne même ne doit pas être inclue?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1958998
Tangrim
Des bisous et des nounours !
Posté le 20-01-2010 à 12:37:45  profilanswer
 
n°1959048
masklinn
í dag viðrar vel til loftárása
Posté le 20-01-2010 à 13:59:30  profilanswer
 


bah étant très feignant je dirais

Code :
  1. from itertools import dropwhile
  2. with open('file.name.out', 'w') as output:
  3.    with open('file.name') as input:
  4.        output.writelines(reversed(
  5.            dropwhile(lambda line: 'TIMESTAMP' not in line,
  6.                      reversed(input))))


il y a sûrement des erreurs, c'est pas testé du tout, mais ça devrait être un truc du style.


Message édité par masklinn le 20-01-2010 à 13:59:43

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1959078
Tangrim
Des bisous et des nounours !
Posté le 20-01-2010 à 14:33:51  profilanswer
 

Il y a une erreur de synthaxe quelque part mais je crois avoir pigé le principe, merci beaucoup pour ton aide.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
mood
Publicité
Posté le 20-01-2010 à 14:33:51  profilanswer
 

n°1959118
Tangrim
Des bisous et des nounours !
Posté le 20-01-2010 à 15:55:04  profilanswer
 

Ça fonctionne :

Code :
  1. from itertools import dropwhile
  2. inpout="/home/moi/python/alphabet"
  3. output="/home/moi/python/alphabet2"
  4. temp="/home/moi/python/tempo"
  5. # lecture du fichier d'entrée
  6. filetoparse=open(inpout,'r')
  7. linetoparse=filetoparse.readlines()
  8. filetoparse.close()
  9. wtemp=open(temp,'w')
  10. # écriture des lignes à garder à l'envers dans un fichier temporaire
  11. wtemp.writelines(dropwhile(lambda line: "TIMESTAMP" not in line,reversed(linetoparse)))
  12. wtemp.close()
  13. # effacement de la première ligne du fichier
  14. firstlinemustdie=open(temp,'r').readlines()
  15. del firstlinemustdie[0]
  16. firstlinedie=open(temp,'w').writelines(firstlinemustdie)
  17. # lecture du fichier temporaire
  18. filetoparse=open(temp,'r')
  19. linetoparse=filetoparse.readlines()
  20. filetoparse.close()
  21. woutput=open(output,'w')
  22. # écriture à l'envers (donc à l'endroit) dans le fichier de sortie
  23. for line in reversed(linetoparse):
  24.         woutput.writelines(line)
 


Message édité par Tangrim le 20-01-2010 à 16:49:07

---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
n°1959703
suizokukan
Posté le 22-01-2010 à 14:05:53  profilanswer
 

J'arrive après la discussion... mais la création d'un fichier temporaire passe plutôt par un module spécialisé en Python : http://docs.python.org/library/tempfile.html, non ?


---------------
rule #1 : trust the python
n°1962594
Tangrim
Des bisous et des nounours !
Posté le 03-02-2010 à 13:53:25  profilanswer
 

suizokukan a écrit :

J'arrive après la discussion... mais la création d'un fichier temporaire passe plutôt par un module spécialisé en Python : http://docs.python.org/library/tempfile.html, non ?


Je suis en train de regarder ça, ça semble plus elegant que mon tempo en effet.
 
Merci.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
n°2008671
gzii
court-circuit
Posté le 11-07-2010 à 10:26:15  profilanswer
 

Bizarre vos trucs me paraissent bien compliqués.
 
J'aurais à priori chargé, splitté sur le retour à la ligne, parcouru à l'inverse par indice pour retenir l'indice voulu et juste écrit la partie [ :indice ].


Message édité par gzii le 11-07-2010 à 10:26:29
n°2009076
eyquem
Posté le 13-07-2010 à 22:18:01  profilanswer
 

C’est en effet compliqué, à cause du fait que le fichier est considéré comme constitué de lignes, alors que c’est essentiellement une succession de caractères.
 

Code :
  1. with open('fichier coupable.txt','r+b') as f:
  2.      f.seek(f.read().rfind('TIMESTAMP'))
  3.      f.readline()
  4.      f.truncate()


 
L'ouverture en mode binaire est obligatoire sinon seek() risque de ne pas positionner au bon endroit.  
 
 
Si le fichier est trop gros pour ne pas épuiser la RAM, on pourra facilement adapter ce code pour rechercher dans le fichier par morceaux.
 


Message édité par eyquem le 13-07-2010 à 22:20:36

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  [Python] Supprimer la fin d'un fichier texte

 

Sujets relatifs
Redirection de la sortie standard vers une ligne d'un fichier texteVSB et excel fichier VALIDE - on peut fermer le post
parcourir fichier CSV (TAB), saut de ligne non détecté[Résolu] boucle for ne retient que la dernière ligne du fichier
suppression structure dans fichierthreads en chat sur Python
[C] Ecriture dans un fichier[PHP] Remplacer un texte avec étoiles et plus présent dans un autre
CMS en PHP vs CMS en Python 
Plus de sujets relatifs à : [Python] Supprimer la fin d'un fichier texte


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR