Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lire un fichier à l'envers

6 réponses
Avatar
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

6 réponses

Avatar
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,

-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
Avatar
Damien Wyart
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
Avatar
Nicolas
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
Avatar
Kevin Denis
Le 08-11-2011, Damien Wyart a écrit :
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
Avatar
Damien Wyart
* Nicolas in fr.comp.lang.python:
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
Avatar
Nicolas
Le 09/11/2011 10:55, Damien Wyart a écrit :
* Nicolas in fr.comp.lang.python:
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.