[Python] Supprimer la fin d'un fichier texte

Supprimer la fin d'un fichier texte [Python] - Python - Programmation

Marsh Posté le 20-01-2010 à 10:59:17    

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
Reply

Marsh Posté le 20-01-2010 à 10:59:17   

Reply

Marsh Posté le 20-01-2010 à 11:21:42    

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.

Reply

Marsh Posté le 20-01-2010 à 11:24:00    

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
Reply

Marsh Posté le 20-01-2010 à 11:34:44    

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
Reply

Marsh Posté le 20-01-2010 à 11:42:51    

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
Reply

Marsh Posté le 20-01-2010 à 12:07:51    

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
Reply

Marsh Posté le 20-01-2010 à 12:15:46    

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
Reply

Marsh Posté le 20-01-2010 à 12:37:45    

Reply

Marsh Posté le 20-01-2010 à 13:59:30    


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
Reply

Marsh Posté le 20-01-2010 à 14:33:51    

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
Reply

Marsh Posté le 20-01-2010 à 14:33:51   

Reply

Marsh Posté le 20-01-2010 à 15:55:04    

Ç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
Reply

Marsh Posté le 22-01-2010 à 14:05:53    

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
Reply

Marsh Posté le 03-02-2010 à 13:53:25    

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
Reply

Marsh Posté le 11-07-2010 à 10:26:15    

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
Reply

Marsh Posté le 13-07-2010 à 22:18:01    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed