IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

seek sur un fichier csv provenant d'un .zip


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Points : 19
    Points
    19
    Par défaut seek sur un fichier csv provenant d'un .zip
    J'utilise les étapes suivantes pour lire un fichier .csv:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    # Détermination de l'encoding
     
    filename.seek(0)
    s=filename.read()
    result = chardet.detect(s)
    encoding = result['encoding']
    confidence=result['confidence']
    if confidence < 0.9 and encoding.startswith('ISO-8859'): 
      encoding='windows-1252'
    filename.seek(0)
     
    # Lecture du fichier
     
    for i,row in enumerate(codecs.getreader(encoding)(filename)):
    Ne me demandez pourquoi il y a le test un peu étrange sur la confidence, c'est le seul moyen que j'ai trouvé pour que ça fonctionne avec l'encodage Windows...

    J'ai besoin de la ligne filename.seek(0) pour réinitialiser le curseur de lecture avant l'appel à enumerate. Je ne peux pas conserver le résultat de l'appel initial à la méthode read() car je ne connais pas encore l'encoding à ce stade.

    Je peux entrer de deux manières dans la fonction, soit avec un fichier classique (self.request.FILES['file_download'] dans Django, qui nécessite le premier seek), soit avec un fichier qui provient d'un zip. Dans ce cas le fichier est de type ZipExtFile. Malheureusement, la fonction seek ne fonctionne pas sur un fichier de ce type. Comment modifier la fonction pour qu'elle fonctionne également avec les fichiers csv provenant d'un zip?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    [QUOTE=GnarlyYoyo;8732232]J'ai besoin de la ligne filename.seek(0) pour réinitialiser le curseur de lecture avant l'appel à enumerate. Je ne peux pas conserver le résultat de l'appel initial à la méthode read() car je ne connais pas encore l'encoding à ce stade./QUOTE]

    non, vous n'en avez pas besoin...
    ligne 2, vous avez lu le fichier et son contenu est associé à la variable s.
    Une fois l'encoding trouvé, vous pouvez décoder "s" sans relire le fichier.
    Soit data = s.decode(...l'encoding trouvé...), vous faites ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i, row in enumerate(data.splitlines()):
         ....
    note: la seule différence est que vos "row" ne se terminent plus par "fin de ligne".
    Une autre solution (puisque vous lisez déjà tout le fichier...) est d'utiliser io.BytesIO, i.e. ligne 11 à la place du .seek:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filename = io.BytesIO(s)
    çà permet de créer un objet semblable a un fichier dont les données sont en mémoire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. problème d'accent sur le fichier csv
    Par olikhvar dans le forum Langage
    Réponses: 1
    Dernier message: 05/02/2011, 07h04
  2. Comparaison et calcul sur 2 fichiers csv
    Par Sebounet54 dans le forum Pentaho
    Réponses: 4
    Dernier message: 10/12/2009, 08h55
  3. [Vxi3] Invite (@Prompt) sur un fichier CSV ?
    Par ghohm dans le forum Designer
    Réponses: 10
    Dernier message: 09/10/2009, 18h30
  4. Selection sur un fichier csv
    Par ybru99 dans le forum Jasper
    Réponses: 1
    Dernier message: 31/01/2008, 09h52
  5. travailler sur un fichier csv
    Par james2606 dans le forum Langage
    Réponses: 3
    Dernier message: 24/01/2007, 10h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo