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
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Damien Wyart
Le #23945961
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?



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,

-comment faire la même chose pour un fichier binaire et non texte?



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
Damien Wyart
Le #23947741
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,



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
Nicolas
Le #23947891
Le 08/11/2011 15:06, Kevin Denis a écrit :
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



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
Kevin Denis
Le #23948051
Le 08-11-2011, Damien Wyart
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?



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,



Nickel, merci.

-comment faire la même chose pour un fichier binaire et non texte?



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 :r
http://stackoverflow.com/questions/1035340/reading-binary-file-in-python



Parfait. Là, ça me renverse bien tout le fichier.
Merci
--
Kevin
Damien Wyart
Le #23948171
* Nicolas
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.



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
Nicolas
Le #23948741
Le 09/11/2011 10:55, Damien Wyart a écrit :
* Nicolas
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.



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.


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.


Sinon, il est toujours possible de réouvrir stdin en mode binaire :

sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0)



Ce genre d’acrobatie est à utiliser avec des pincettes.
Publicité
Poster une réponse
Anonyme