Nov 24, 2024

Wiki

Python

Aide

edit SideBar

Search

Fileinput

Présentation

Introduction

Considérons le programme suivant, intitulé toto.py :

  import fileinput
  for line in fileinput.input():
      print line

Si l'on exécute

  python toto.py .pythonstartup 

alors chaque ligne du fichier .pythonstartup sera lue. Sinon, l'interpréteur attendra que l'utilisateur saisisse quelque chose au clavier.

Explication

La méthode fileinput.input() reçoit une liste de fichiers texte à examiner (si la liste est vide, la lecture se fera sur l'entrée standard). Le retour est un Iterator, qui lui-même retourne chaque ligne de chaque texte.

  >>> import fileinput
  >>> from os import listdir
  >>> for line in fileinput.input(listdir('.')):
  ...     print line

On ne se soucie pas de quel fichier est concerné, ni de son nombre de lignes.

Utilisation

La base

Il y a deux manières de parcourir les lignes des fichiers reçus dans fileinput.input()...

Utilisation de l'itérateur fournis

Par exemple :

  >>> from os import listdir
  >>> import fileinput
  >>> for line in dd:
  ...     print line

On peut utiliser des méthodes de l'itérateur

  >>> from os import listdir
  >>> import fileinput
  >>> for line in fileinput.input(listdir('.')):
  ...     print line
  ...     print fileinput.filename()
  ...     print fileinput.lineno()
  ...     print fileinput.filelineno()
  ...     print fileinput.isfirstline()
  ...     print fileinput.isstdin()
  ...     fileinput.nextfile()
  >>> fileinput.close()

Dans ce qui précède, on affiche :

  • la ligne courante de l'itérateur,
  • puis le fichier courant,
  • puis le numéro de lignes rencontrées depuis le début de l'itération,
  • puis le numéro de la ligne courante dans le fichier courant,
  • suivi de la réponse à "Cette ligne est-elle la première ligne d'un fichier ?"
  • suivi de la réponse à "Cette ligne provient-elle de l'entrée standart ?"

Enfin, on passe au prochain fichier. A la fin, on ferme l'itérateur.

En utilisant la méthode readline()

  >>> dd=fileinput.input(listdir('.'))
  >>> dd.readline()
  '/etc/gdm/Xsession: Beginning session setup...\n'

Utilisation avancée

Remplacer des fichiers

Si l'argument inplace = 1 est passé à la méthode input() ou au constructeur FileInput(), le fichier sera déplacé dans un fichier backup, et la sortie standart sera redirigée vers le fichier d'entrée.

Un exemple pour bien comprendre l'affaire :

  >>> from os import listdir
  >>> import fileinput
  >>> dd = fileinput.input(listdir('.'), inplace = 1)
  >>> for line in dd:
  ...     if line.startswith('i'):
  ...         print 'i'+line

Ici, on parcours toutes les lignes de tous les fichiers du répertoire courant.

  • si la ligne commence par un 'i', alors elle est conservée, sauf que le 'i' initial est doublé.
  • sinon, la ligne est écrasée, vu qu'on ne l'affiche pas.

Pour remplacer une chaîne (a) par une autre (b), dans tous les fichiers d'un répertoire donné, on peut procéder ainsi :

  >>> from os import listdir
  >>> import fileinput
  >>> dd = fileinput.input(listdir('.'), inplace = 1)
  >>> for line in dd:
  ...     print line.replace(a,b)

Conserver le fichier préexistant

Par défaut, le fichier backup est écrasé. Si on souhaite le conserver, par exemple avec l'extension '.bak' :

  >>> dd = fileinput.input(listdir('.'), inplace = 1, backup = ".bak")

Cette méthode de substitution est cependant assez lente.

Page Actions

Recent Changes

Group & Page

Back Links