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 :

Decoupage chaine de caracteres


Sujet :

Python

  1. #1
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut Decoupage chaine de caracteres
    Bonjour à tous ;

    Je reprend du code Perl vers Python et je bute sur un bout de code qui me permet de 'découper' un chaîne de plusieurs dizaines de milliers de caractères en morceau de 160 caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            ### Decoupage du fichier en chaines de 160 caractères
            @t1 = $texte =~ m/(.{160})/g ;
    Je désirerai ne pas utiliser de boucle pour arriver à ce résultat (ça je sais faire).

    Est il possible de faire l’équivalent en python ?

    Merci pour votre aide !!


    PS : Ce bout de code n’étant pas optimal car il perd la dernière séquence si elle fait moins de 160 caractères.

  2. #2
    Membre éclairé
    Homme Profil pro
    Data Lover
    Inscrit en
    Décembre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data Lover
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 96
    Par défaut
    Bonjour,

    C'est possible de le faire avec la compréhension de listes mais toutefois, il y a un petit "for" dedans.

  3. #3
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Oui ça m’intéresse alors , merci

  4. #4
    Membre éclairé
    Homme Profil pro
    Data Lover
    Inscrit en
    Décembre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data Lover
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 96
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine = "votre chaine de caractères"
    n = 160 # nombre de caractères à découper
    chaine_decoupee = [chaine[i:i+n] for i in range(0, len(chaine), n)]

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    attention que la méthode par slicing ne produit pas tout à fait le même résultat

    par exemple si on considère la chaine ABCDEFGHIJKLMNOPQRSTUVWXYZ qu'on veut découper par blocs de 4 :

    avec Perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -e 'my $texte = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; my @t1 = $texte =~ m/(.{4})/g; print join(", ", @t1);'
    ABCD, EFGH, IJKL, MNOP, QRST, UVWX
    avec Python via slicing :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ python -c 'texte = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; print ", ".join([texte[i:i+4] for i in range(0, len(texte), 4)])'
    ABCD, EFGH, IJKL, MNOP, QRST, UVWX, YZ
    avec Python via regexp (findall(r'.{160}', texte)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    python -c "import re; texte = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; print(', '.join(re.findall(r'.{4}', texte)))"
    ABCD, EFGH, IJKL, MNOP, QRST, UVWX

  6. #6
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Merci à tous les deux ;

    La solution de master4 est celle que je vais conserver car justement je tiens à récupérer les caractères 'restants' ... Mais je dois tester sur un fichier de plusieurs dizaine de Mo voir le tps que ça met à être traité ( 17000 fichiers par jours de 30Mo en moyenne )

    Bufferbob , pourquoi n'ai je pas pensé au findall (bientôt les vacances)??? c'est ce qui ressemble le plus au code d'origine .

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    justement je tiens à récupérer les caractères 'restants'
    note qu'on pouvait aussi envisager findall('.{1,160}', texte) dans ce cas.

    Mais je dois tester sur un fichier de plusieurs dizaine de Mo voir le tps que ça met à être traité ( 17000 fichiers par jours de 30Mo en moyenne )
    hmmm... il y a bien une différence de rapidité, les regex sont un peu plus lentes, mais c'est pas non plus ça qui va mettre ta machine à genoux

    sur un fichier unique de ~600M :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    test slicing :
    8.76s
    8.60s
    8.61s
     
    test regexp  :
    9.04s
    9.18s
    8.97s
    m'est avis que c'est plutôt tout le reste du code, notamment les 17000 ouvertures/lectures de fichiers qui vont prendre le plus de temps

    un test de 1700 passes sur un même fichier de ~30M :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test slicing :
    total: 749.186s     average: 0.441s
     
    test regexp  :
    total: 754.923s     average: 0.444s
    5s de différence sur un processus total de près de 12min, c'est finalement assez minime.

    bientôt les vacances
    🥳

  8. #8
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Super , merci pour ces tests BufferBob ,

    Citation Envoyé par BufferBob Voir le message
    5s de différence sur un processus total de près de 12min, c'est finalement assez minime.
    Effectivement la différence n'est pas significative ...

    Citation Envoyé par BufferBob Voir le message
    note qu'on pouvait aussi envisager findall('.{1,160}', texte) dans ce cas.
    Et que du coup je vais corriger dans le script Perl en attendant la version python ; merci

  9. #9
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Tu peux aussi lire directement le fichier par paquets avec f.read(160), et aussi, si tu en as la possibilité, éviter de créer une liste géante et lui préférer un itérateur, exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from functools import partial
     
    with open('fichier.txt', 'rb') as fh:
        result = iter(partial(fh.read, 160), b'')
    Attention car dans ce cas l'itérateur n'est viable qu'au sein du with (car dés que tu en sors le fichier est fermé).
    Si malheureusement tu dois absolument produire la liste, une simple modification suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        result = list(iter(partial(fh.read, 160), b''))

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

Discussions similaires

  1. [Débutant] decoupage d'une chaine de caracteres avec la commande strread
    Par jeune informatique dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/05/2010, 13h49
  2. decoupage d'une chaine de caractere
    Par julinho99 dans le forum Débuter
    Réponses: 13
    Dernier message: 24/09/2008, 15h23
  3. Decoupage chaine de caracteres
    Par Katachana dans le forum Langage
    Réponses: 3
    Dernier message: 12/03/2008, 17h58
  4. decoupage chaine de caractere
    Par shams dans le forum SL & STL
    Réponses: 6
    Dernier message: 10/09/2007, 12h06
  5. [MySQL] probleme decoupage chaine de caractere
    Par mahfout_i dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/03/2006, 18h57

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