Lire un fichier à l'envers
Le
Kevin Denis

Bonjour,
je cherche à lire un fichier à l'envers. Pour des fichiers textes,
je peux faire:
#!/usr/bin/python
import sys
Data = sys.stdin.readlines()
Data.reverse()
for line in Data:
print line
et ensuite un simple:
cat file | ./reverse.py
me renverse mon fichier
$ cat test
abc
123
def
456
$ cat test | ./rev.py
456
def
123
abc
J'ai deux questions:
-pourquoi ai-je un retour à la ligne en trop?
-comment faire la même chose pour un fichier binaire et non texte?
Merci
--
Kevin
je cherche à lire un fichier à l'envers. Pour des fichiers textes,
je peux faire:
#!/usr/bin/python
import sys
Data = sys.stdin.readlines()
Data.reverse()
for line in Data:
print line
et ensuite un simple:
cat file | ./reverse.py
me renverse mon fichier
$ cat test
abc
123
def
456
$ cat test | ./rev.py
456
def
123
abc
J'ai deux questions:
-pourquoi ai-je un retour à la ligne en trop?
-comment faire la même chose pour un fichier binaire et non texte?
Merci
--
Kevin
print ajoute une fin de ligne après ce qu'il a affiché, et readline
n'enlève pas la fin de ligne lors de sa lecture des lignes. Donc soit tu
enlèves les 'n' dans les chaînes de la liste retournée par readlines
(avec du rstrip('n')), soit tu dis à print de ne pas ajouter de retour
à la ligne, en mettant une virgule à la fin de l'instruction :
print line,
import sys
Data = sys.stdin.read()
Data = Data[::-1]
sys.stdout.write(Data)
Ca lit le fichier en mémoire. Pour de gros fichier, il vaut mieux faire
une boucle ; pour cela plusieurs approches sont possibles, voir par
exemple : http://stackoverflow.com/questions/1035340/reading-binary-file-in-python
--
DW
Je n'y ai plus pensé hier, mais tu peux aussi utiliser stdout.write à la
place de print pour un contrôle plus précis des fin de lignes.
--
DW
Dans ton exemple, tu ne lis pas le fichier à l'envers.
Tu le lis dans le bon ordre et tu affiches les lignes à l'envers.
Cette méthode n'a pas de sens pour un fichier binaire (il n'y a pas de
lignes).
Pour lire un fichier binaire à l'envers, il faut commencer à ouvrir le
fichier en mode binaire. sys.stdin n'est pas ouvert en mode binaire. Tu
ne peux donc pas essayer en mode interactif.
f = open("mon_fichier", "rb")
Nicolas
Nickel, merci.
Parfait. Là, ça me renverse bien tout le fichier.
Merci
--
Kevin
Sous Linux, les modes textes et binaires sont équivalents (donc je n'ai
pas tenu compte de ceci dans ma réponse). Par contre sous Windows, il
y a bien une différence.
Sinon, il est toujours possible de réouvrir stdin en mode binaire :
sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0)
--
DW
Il est préférable de prendre l'habitude de préciser le mode binaire.
D'autant plus qu'en Python3 il faut le préciser, quel que soit l'OS.
Ce genre d’acrobatie est à utiliser avec des pincettes.