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 :

Pandas lecture tar.gz [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut Pandas lecture tar.gz
    Bonjour,

    Afin d'éviter de décompresser les fichiers qui se trouvent dans le tar.gz (opération qui dure plusieurs heures), je lis celui-ci directement et boucle sur les fichiers txt à l'intérieur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import tarfile
    import pandas as pd
     
    with tarfile.open("C:/Users/ericm/Documents/EE/V2_GLFI.tar.gz", "r:*") as tar:
        txt_path = list(n for n in tar.getnames() if n.endswith('.TXT'))[-1]
        df = pd.read_fwf(tar.extractfile(txt_path), header=None, encoding="utf_8_sig")
    A l'intérieur de ce tar.gz, la lecture de fichier vide me semble t-il entraine une erreur avec pandas:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    EmptyDataError                            Traceback (most recent call last)
    <ipython-input-28-9427c718b7ae> in <module>
          4 with tarfile.open("C:/Users/ericm/Documents/EE/V2_GLFI.tar.gz", "r:*") as tar:
          5     txt_path = list(n for n in tar.getnames() if n.endswith('.TXT'))[-1]
    ----> 6     df = pd.read_fwf(tar.extractfile(txt_path), header=None, encoding="utf_8_sig")
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in read_fwf(filepath_or_buffer, colspecs, widths, infer_nrows, **kwds)
        844     kwds["infer_nrows"] = infer_nrows
        845     kwds["engine"] = "python-fwf"
    --> 846     return _read(filepath_or_buffer, kwds)
        847 
        848 
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
        450 
        451     # Create the parser.
    --> 452     parser = TextFileReader(fp_or_buf, **kwds)
        453 
        454     if chunksize or iterator:
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
        944             self.options["has_index_names"] = kwds["has_index_names"]
        945 
    --> 946         self._make_engine(self.engine)
        947 
        948     def close(self):
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
       1187                     'are "c", "python", or "python-fwf")'
       1188                 )
    -> 1189             self._engine = klass(self.f, **self.options)
       1190 
       1191     def _failover_to_python(self):
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, **kwds)
       3780         self.colspecs = kwds.pop("colspecs")
       3781         self.infer_nrows = kwds.pop("infer_nrows")
    -> 3782         PythonParser.__init__(self, f, **kwds)
       3783 
       3784     def _make_reader(self, f):
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, **kwds)
       2391         # Set self.data to something that can read lines.
       2392         if hasattr(f, "readline"):
    -> 2393             self._make_reader(f)
       2394         else:
       2395             self.data = f
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in _make_reader(self, f)
       3783 
       3784     def _make_reader(self, f):
    -> 3785         self.data = FixedWidthReader(
       3786             f,
       3787             self.colspecs,
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, colspecs, delimiter, comment, skiprows, infer_nrows)
       3675         self.comment = comment
       3676         if colspecs == "infer":
    -> 3677             self.colspecs = self.detect_colspecs(
       3678                 infer_nrows=infer_nrows, skiprows=skiprows
       3679             )
     
    ~\anaconda3\lib\site-packages\pandas\io\parsers.py in detect_colspecs(self, infer_nrows, skiprows)
       3743         rows = self.get_rows(infer_nrows, skiprows)
       3744         if not rows:
    -> 3745             raise EmptyDataError("No rows from which to infer column width")
       3746         max_len = max(map(len, rows))
       3747         mask = np.zeros(max_len + 1, dtype=int)
     
    EmptyDataError: No rows from which to infer column width
    Comment SVP puis je contourner cette erreur sans enlever les fichiers vides?

    Merci pour votre aide.

    Eric

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par Eric_03 Voir le message
    Comment SVP puis je contourner cette erreur sans enlever les fichiers vides?
    En testant ce qui est lu avant de le donner à manger à Pandas.

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

  3. #3
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Bonjour,

    Depuis votre message j'essaie avec os.path.getsize sans succès.

    Est ce que os.path.getsize peut retourner la taille d'un fichier qui se trouve dans un tar.gz?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import os
     
    def get_size(chemin):
        try:
            size = os.path.getsize(chemin)
            print("t 'size'")
            return size
        except OSError :
            size = 0
            print("E 'size'")
            return size
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import tarfile
    import pandas as pd
     
    with tarfile.open("C:/Users/ericm/Documents/EE/V3_GLFI.tar.gz", "r:*") as tar:
        txt_path = list(n for n in tar.getnames() if n.endswith('.TXT'))[-1]
        print (txt_path)
        size = get_size(txt_path)
        print (size)
        if size > 0:
            df = pd.read_fwf(tar.extractfile(txt_path), header=None, encoding="utf_8_sig")
            print(df)
    output
    BALANCE L2.TXT
    E 'size'
    0

    Merci

    Eric

  4. #4
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Nom : Capture d’écran 2021-01-24 140102.png
Affichages : 319
Taille : 2,9 Ko

    En décompressant sur disque j'ai environ 180 Go

    Environ 2 heures de décompression avec 7zip 30 min gz puis 1h30 tar

    Nom : Capture d’écran 2021-01-24 141409.png
Affichages : 345
Taille : 12,2 Ko

    Nom : Capture d’écran 2021-01-24 143712.png
Affichages : 322
Taille : 3,6 Ko

    Nom : Capture d’écran 2021-01-24 143812.png
Affichages : 335
Taille : 12,9 Ko

    Eric

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    L'erreur a été donné par Python et son module Pandas quand un fichier est vide apparemment. Je connais pas suffisamment pandas, mais un try-except sur l'endroit où vous tentez avec pandas peut peut-être le faire, si d'autres erreurs ne sont pas découvertes entre temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tarfile
    import pandas as pd
     
    with tarfile.open("C:/Users/ericm/Documents/EE/V2_GLFI.tar.gz", "r:*") as tar:
        txt_path = list(n for n in tar.getnames() if n.endswith('.TXT'))[-1]
        try:         
            df = pd.read_fwf(tar.extractfile(txt_path), header=None, encoding="utf_8_sig")
        except EmptyDataError:
            print("fichier vide")
    Maintenant je ne sais pas si pd.read_fwf est adapté, je ne connais pas assez pandas pour l'affirmer, mais j'ai un petit doute...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Eric_03 Voir le message
    Est ce que os.path.getsize peut retourner la taille d'un fichier qui se trouve dans un tar.gz?
    Cela voudrait dire que os.path.getsize() implémente le protocole tgz pour traiter un fichier de ce format. Cela va à l'encontre de la philosophie Python "simple is better than complex" et de l'atomicité des fonctions. Une fonction qui donne la taille d'un fichier ne fait que donner la taille d'un fichier. Elle ne va pas en plus regarder si ledit fichier serait par hasard une archive qui contiendrait d'autres fichiers et qu'il faudrait alors en réalité décompresser au lieu de simplement donner sa taille. Sinon on n'en finit pas.

    Citation Envoyé par Eric_03 Voir le message
    En décompressant sur disque j'ai environ 180 Go

    Environ 2 heures de décompression avec 7zip 30 min gz puis 1h30 tar
    Mouais. Sur un Linux virtualisé par VirtualBox (donc il tourne sur un simulateur et non pas directement sur ma carte mère), je décompresse par "tar" un fichier ".tar.xz" de 3.3Go (fichier final 9Go) en 9mn. Donc en proportion, 9mn pour 9Go c'est 3h pour 180Go.
    Nom : VirtualBox_Xubuntu64_24_01_2021_14_41_45.png
Affichages : 323
Taille : 160,7 Ko

    Ok. Peut-être alors vaut-il mieux dézipper ton truc une bonne fois et travailler sur les fichiers extraits que le dézipper en RAM. Parce que ça ne devrait pas mettre beaucoup moins de temps en RAM que sur disque, surtout quand on parle de 180Go (gros swap en perspective)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Ok

    merci pour la réponse.

    En testant ce qui est lu avant de le donner à manger à Pandas
    Mais alors comment puis je faire pour vérifier ce que je donne à manger à Python SVP?

    Eric

  8. #8
    Membre confirmé
    Profil pro
    Pôle Etude et Automatisation
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pôle Etude et Automatisation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Merci fred 1599

    je teste et fais un retour

    => name 'EmptyDataError' is not defined

    Eric

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par Eric_03 Voir le message
    Depuis votre message j'essaie avec os.path.getsize sans succès.
    Je ne comprends pas trop votre logique.

    La chose à filtrer est ce qui est retourné par tar.extractfile(txt_path) (i.e. le contenu du fichier, les données).
    La documentation dit que çà retourne un io.BufferedReader.

    Vous avez 2 solutions à explorer: est-ce qu'on peut récupérer la taille du txt_path avec tar.getmember(...)? Si ce n'est pas suffisant, lire le contenu de l'io.BufferedReader pour tester ce qu'il contient peut être aussi à explorer.

    os.path.getsize est à utiliser pour les "vrais" fichiers pas pour ceux qui sont à extraire d'un fichier tar...

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

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Eric_03 Voir le message
    Afin d'éviter de décompresser les fichiers qui se trouvent dans le tar.gz (opération qui dure plusieurs heures), je lis celui-ci directement et boucle sur les fichiers txt à l'intérieur:
    Plusieurs heures pour décompresser un tar.gz ??? Il fait quelle taille ce tgz ? 500 To ???
    Ok plusieurs heures pour compresser à la limite je peux accepter (toutefois j'ai moi-même compressé des fichiers de 20Go au format .tar.xz, ce qui est encore plus long que le .tar.gz car la compression xz est encore plus performante d'environ 20% mais prend en retour encore plus de temps et jamais cela ne m'a pris plus d'une dizaine de minutes) mais pour décompresser (opération assez rapide car il n'y a rien à calculer) là je reste sceptique.
    Et ensuite là où la décompression sur disque prend plusieurs heures la décompression en ram serait instantanée ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/12/2020, 16h03
  2. [Python 2.X] index sur lecture csv panda
    Par bernards111 dans le forum Général Python
    Réponses: 1
    Dernier message: 24/12/2019, 10h56
  3. Lecture Fichiers Tar
    Par seeme dans le forum C++
    Réponses: 2
    Dernier message: 10/11/2010, 14h31
  4. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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