Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Mise en forme d'un fichier CSV à l'aide de générateurs

Mise en forme d'un fichier CSV à l'aide de générateurs

Remonter à Forum général Python
  • Mise en forme d'un fichier CSV à l'aide de générateurs

    Envoyé par ychaouche le 8 Août 2008 à 10:20
    Bonjour à tous,

    J'ai ça :

    20080722 ,0 ,"2007","10135","50","S","UNE COMPAGNIE ASBL "
    20080722 ,0 ,"2007","22948","41","A","GONG LIMITED "


    Je veux ça (supprimer les espaces en trop) :

    20080722 ,0 ,"2007","10135","50","S","UNE COMPAGNIE ASBL "
    20080722 ,0 ,"2007","22948","41","A","GONG LIMITED "


    Dans un deuxième temps, supprimer aussi les espaces à l'intérieur des guillemets.

    Je souhaite le faire avec des générateurs mais je bloque. Voici le code sans :


    class TraitementFichier:
    """
    """
    def __init__(self,nomFichierIn,nomFichierOut):
    """
    """
    self.ficIN = file(nomFichierIn)
    self.ficOUT = file(nomFichierOut,'w')

    def traiter(self):
    """
    """
    lignesCorrectes=[]
    for ligne in self.ficIN :
    champs = ligne.strip().split(",")
    champsCorrects = (champ.strip() for champ in champs)
    ligneCorrecte = ",".join(champsCorrects)+"\n"
    lignesCorrectes.append(ligneCorrecte)
    self.ficOUT.writelines(lignesCorrectes)
    self.ficOUT.close()
    self.ficIN.close()

    tf = TraitementFichier("toto.csv","totogood.csv")
    tf.traiter()



    L'idée serait d'avoir un code tout-générateur de manière à ne pas stocker en mémoire
    (dans lignesCorrectes dans mon cas) un fichier de 25 Mo.

    Toute suggestion est appréciée.

    • Re: Mise en forme d'un fichier CSV à l'aide de générateurs

      Envoyé par e-satis le 8 Août 2008 à 12:21
      Hello ychaouche,

      Puisque tu semble un peu loin pour le coca que je te dois, je te rembourse en code, ça roule ?


      out = open("good.csv", "w")

      for clean_line in (','.join( '"'+word.replace('"', '').strip()+'"' for word in line.split(',')) for line in open("bad.csv")) :
      out.write(clean_line + "\n")



      Testé sur un fichier de 300 Mo : consommation de mémoire 1.1 MO.
    • Re: Mise en forme d'un fichier CSV à l'aide de générateurs

      Envoyé par ychaouche le 18 Août 2008 à 13:18
      Merci pour ta réponse e-satis et désolé pour le retard, j'ai eu une semaine un peu chargée car je code en ce moment.

      Pour le remboursement, je regrette mais nous n'acceptons que du liquide ;)

      Ton code utilise une petite boucle for, c'est cette boucle dont je voulais me débarrasser mais je n'ai pas réussi.

      Finalement, j'ai utilisé le module csv, et, roulement de tambours.... le module csv n'en veut pas des générateurs, il veut des listes. Donc j'ai finalement pondu :



      def traiterCSV(self):
      """
      """
      INCSV = csv.reader(self.ficIN,delimiter=",",dialect="excel")
      OUTCSV = csv.writer(self.ficOUT,delimiter=",",dialect="excel")
      for ligne in INCSV :
      champsCorrects = [ champ.strip() for champ in ligne]
      OUTCSV.writerow(champsCorrects)
      self.ficOUT.close()
      self.ficIN.close()


    • Re: Mise en forme d'un fichier CSV à l'aide de générateurs

      Envoyé par ychaouche le 8 Août 2008 à 10:21
      btw, s'il y a une commande unix qui fait ça toute seule je suis preneur (ou un script sed/perl simple et rapide)
Rendu par Ploneboard