#! /usr/bin/python
# -*- coding:utf8 -*-

'''
Exercice du livre sur Python 3.

Ce code est diffusé sous la licence GPLv3 (http://www.gnu.org/licenses/gpl.html).
Copyright © 2010 Harold Erbin <harold.erbin@gmail.com>
'''

class FileManager:
    '''
    Classe supposée faciliter la manipulation d'un fichier
    '''
    
    def __init__(self,fn):
        # N'ouvre pas le fichier tout de suite, pour
        # ne pas bloquer la ressource pendant toute
        # l'existence de l'objet
        self.filename = fn
    
    def count(self):
        "Compte les lignes, mots et caractères."
        file = open(self.filename,'r')
        nblines, nbwords, nbchars = 0, 0, 0
        for line in file:
            nblines += 1
            nbwords += len(line.split())
            nbchars += len(line)
        file.close()
        return nblines, nbwords, nbchars
    
    def head(self,n):
        "Renvoie les n premières lignes."
        file = open(self.filename,'r')
        lines = []
        while len(lines)<n:
            lines.append(file.readline())
        file.close()
        return lines
    
    def tail(self,n):
        "Renvoie les n dernières lignes."
        file = open(self.filename,'r')
        lines = []
        while len(lines)<n:
            lines.append('')
        for line in file:
            lines.append(line)
            del lines[0]
        file.close()
        return lines
    
    def find(self,str):
        "Affiche toutes les lignes contenant la chaine str"
        file = open(self.filename,'r')
        for line in file:
            if str in line:
                print line,
        file.close()
    
    def replace(self,str1,str2):
        '''
        Affiche à l’écran toutes les lignes du fichier,
        en remplaçant chaque occurrence de str1 par str2.
        '''
        file = open(self.filename,'r')
        for line in file:
            print line.replace(str1,str2),
        file.close()

# test unitaire

def display_title(title):
    print '='*len(title)
    print title
    print '='*len(title)
    
if __name__=='__main__':
    
  name = 'bases-06-classes-exo1.txt'
  mgr = FileManager(name)
  
  display_title('Statistiques de '+name)
  print '%d lignes, %d mots et %d caracteres' % mgr.count()
  
  display_title('Trois premieres lignes')
  print ''.join(mgr.head(3)),
  
  display_title('Trois dernieres lignes')
  print ''.join(mgr.tail(3)),
  
  display_title("Lignes contenant 'lignes'")
  mgr.find('lignes')
  
  display_title("Fichier complet avec 'lignes' remplace par 'machins'")
  mgr.replace('lignes','machins')











