import csv
import os

def lecture_fichier_csv(nom_fichier, delimiteur=";"):
    """Fonction de lecture d'un fichier csv. Renvoie une liste de dictionnaires contenant
       tous les enregistrements du fichier ou None si le fichier n'existe pas"""
    if os.path.isfile(nom_fichier):               # Test de l'existence du fichier
        with open(nom_fichier, "r", encoding='utf-8') as fichier:   # On l'ouvre en lecture seule
            csvReader = csv.DictReader(fichier, delimiter = delimiteur)
            contenu = []                          # Contiendra les enregistrements du fichier
            for ligne in csvReader:               # Parcourt le fichier ligne par ligne
                contenu.append(dict(ligne))       # Chaque ligne est un nouvel enregistrement
            return contenu
    else:
        return None                               # Si le fichier n'existe pas, on renvoie None

def longueur_champ(champ):
    """Détermine la longueur que doit avoir un champ à l'affichage à partir de son nom
       et de la liste ci-dessous"""
    longueur_champs={'Défaut': 5, 'ISO':2, 'Name':15, 'Area':10,'Population':10, 'Continent':4,
                     'Capital_Id':8, 'Currency_Code':3, 'Currency_Name':8, 
                     'Id':8, 'Latitude':9, 'Longitude':9, 'Country_ISO':2,
                     'Nom':18, 'Monnaie':8, 'Superficie':10, 'Capitale': 12, 'Population totale':10,
                     'Pop. capitale':9, 'Ratio':10, 'VName':15, 'VPopulation':9}
    if champ in longueur_champs: # Le champ est-il dans la liste des longueurs de champ connues ?
        return longueur_champs[champ]    # Si oui, on renvoie sa longueur
    return longueur_champs['Défaut']    # Si non, on prend la valeur par défaut

def affiche_table(table):
    """Procédure permettant d'afficher une table avec une longueur d'affichage bien définie
       pour chaque champ afin que les colonnes restent bien alignées"""

    # Affichage de l'en-tête avec les noms des descripteurs
    # On se base sur le nom des clés du premier enregistrement
    for champ in table[0].keys():
        print(champ[:longueur_champ(champ)] + " "*(max(0,longueur_champ(champ)-len(champ))+1),
              end="")
    print()
    # Affichage des données des enregistrements
    for dic in table:
        for champ, valeur in dic.items():
            valeur = str(valeur)    # On passe la valeur en chaîne pour l'afficher
            print(valeur[:longueur_champ(champ)]+" "*(max(0,longueur_champ(champ)-len(valeur))+1),
                  end="")
        print()

