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 :

comment fractionner un fichier texte en plusieurs colonnes? [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Octobre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Octobre 2018
    Messages : 9
    Par défaut comment fractionner un fichier texte en plusieurs colonnes?
    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
    wpbfl2-45.gate.net [29:23:54:20] "GET /icons/ok2-0.gif HTTP/1.0" 200 231
    tanuki.twics.com [29:23:54:25] "GET /OSWRCRA/general/hotline/ HTTP/1.0" 200 991
    tanuki.twics.com [29:23:54:37] "GET /docs/OSWRCRA/general/hotline/95report HTTP/1.0" 302 -
    wpbfl2-45.gate.net [29:23:54:37] "GET /docs/browner/adminbio.html HTTP/1.0" 200 4217
    tanuki.twics.com [29:23:54:40] "GET /OSWRCRA/general/hotline/95report/ HTTP/1.0" 200 1250
    wpbfl2-45.gate.net [29:23:55:01] "GET /docs/browner/cbpress.gif HTTP/1.0" 200 51661
    dd15-032.compuserve.com [29:23:55:21] "GET /Access/chapter1/s2-4.html HTTP/1.0" 200 4602
    tanuki.twics.com [29:23:55:23] "GET /docs/OSWRCRA/general/hotline/95report/05_95mhr.txt.html HTTP/1.0" 200 56431
    wpbfl2-45.gate.net [29:23:55:29] "GET /docs/Access HTTP/1.0" 302 -
    140.112.68.165 [29:23:55:33] "GET /logos/us-flag.gif HTTP/1.0" 200 2788
    wpbfl2-45.gate.net [29:23:56:14] "GET /Access/images/epaseal.gif HTTP/1.0" 200 2624
    tanuki.twics.com [29:23:56:24] "GET /OSWRCRA/general/hotline/95report/ HTTP/1.0" 200 1250
    freenet2.carleton.ca [29:23:56:36] "GET /emap/html/regions/four/ HTTP/1.0" 200 15173
    wpbfl2-45.gate.net [29:23:57:05] "GET /waisicons/unknown.gif HTTP/1.0" 200 83
    ix-mia5-17.ix.netcom.com [29:23:57:06] "GET /OWOW/ HTTP/1.0" 200 1501
    wpbfl2-45.gate.net [29:23:57:08] "POST /cgi-bin/waisgate/134.67.99.11=earth1.epa.gov=210=/indexes/ACCESS=gopher%40earth1.epa.gov=0.00=:free HTTP/1.0" 200 26217
    wpbfl2-45.gate.net [29:23:57:12] "GET /waisicons/text.xbm HTTP/1.0" 200 527
    ix-knx-tn1-22.ix.netcom.com [29:23:57:28] "GET / HTTP/1.0" 200 4889
    Bonjour, Je voudrais savoir s'il est possible de fractionné en colonnes ce fichier tout en choisissant le nbre de colonne (par exemple en 5 col dans mon cas)?
    J’ai essayé split (" ") avec l’espace comme séparateur j’obtiens plus que 5 colonnes par endroits alors comment parer à sa et obtenir 5 colonnes partout.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Salut,
    Vous voyez bien qu'appliquer .split( ' ') à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wpbfl2-45.gate.net [29:23:54:20] "GET /icons/ok2-0.gif HTTP/1.0" 200 231
    va découper la chaîne du milieu en 2.
    Mais vous pourriez cherchez les 2 guillemets pour avoir un premier découpage du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ 'wpbfl2-45.gate.net [29:23:54:20]', '"GET /icons/ok2-0.gif HTTP/1.0"',  '200 231']
    et appliquer .split(' ') à la première et à la dernière s/chaîne.

    Le méthode la plus "normale" serait d'utiliser des regexp mais il faut prendre le temps d'apprendre à les utiliser car c'est un mini-langage "à part".

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    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 816
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par blackpirates Voir le message
    J’ai essayé split (" ") avec l’espace comme séparateur j’obtiens plus que 5 colonnes par endroits alors comment parer à sa et obtenir 5 colonnes partout.
    Le souci c'est que Python ne se pose pas de question. Tu lui demandes "espace" il te coupe sur l'espace.
    Evidemment nous les lecteurs nous voyons bien que "GET /icons/ok2-0.gif HTTP/1.0" doit être considéré comme un "tout" (à cause des guillemets d'encapsulation) mais Python, en natif, ne le voit pas. Pour lui ce n'est que du texte brut.

    Une première solution est d'utiliser les regex comme le dit wiztricks. Une seconde pourrait être d'essayer de voir la source de ce log et lui demander de rendre ce fichier "splittable" c'est à dire d'y mettre des séparateurs un peu plus spécifiques que l'espace. Une 3° solution serait de créer une fonction plus complexe que le basique split qui analyse la ligne pour considérer toute chaine entre guillemets comme unique et non splittable. Fonction à écrire soi-même bien évidemment.
    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]

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    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 988
    Par défaut
    Une autre manière de faire possible est de lire le fichier comme un csv en définissant ses propres options de format (en l'occurrence, il suffit de prendre l'espace (ou la tabulation) à la place de la virgule comme séparateur de champ, car le " est déjà le caractère de protection par défaut).

  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,

    l'idée c'est quand même de connaitre le format de son fichier, c'est un fichier de log, son contenu est structuré, et en général le format de la ligne de log est décrit en détail et modifiable dans la configuration du serveur web

    une regex possible :
    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
    >>> reg = re.compile(r'^(?P<host>.+?) \[(?P<timestamp>.+?)\] \"(?P<request>.+)\" (?P<code>\d+) (?P<nbytes>\d+|-)$')
    >>> with open('access.log') as f:
    ...   for line in f:
    ...     print(f'{reg.search(line).groupdict()}')
    ...
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:54:20', 'request': 'GET /icons/ok2-0.gif HTTP/1.0', 'code': '200', 'nbytes': '231'}
    {'host': 'tanuki.twics.com', 'timestamp': '29:23:54:25', 'request': 'GET /OSWRCRA/general/hotline/ HTTP/1.0', 'code': '200', 'nbytes': '991'}
    {'host': 'tanuki.twics.com', 'timestamp': '29:23:54:37', 'request': 'GET /docs/OSWRCRA/general/hotline/95report HTTP/1.0', 'code': '302', 'nbytes': '-'}
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:54:37', 'request': 'GET /docs/browner/adminbio.html HTTP/1.0', 'code': '200', 'nbytes': '4217'}
    {'host': 'tanuki.twics.com', 'timestamp': '29:23:54:40', 'request': 'GET /OSWRCRA/general/hotline/95report/ HTTP/1.0', 'code': '200', 'nbytes': '1250'}
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:55:01', 'request': 'GET /docs/browner/cbpress.gif HTTP/1.0', 'code': '200', 'nbytes': '51661'}
    {'host': 'dd15-032.compuserve.com', 'timestamp': '29:23:55:21', 'request': 'GET /Access/chapter1/s2-4.html HTTP/1.0', 'code': '200', 'nbytes': '4602'}
    {'host': 'tanuki.twics.com', 'timestamp': '29:23:55:23', 'request': 'GET /docs/OSWRCRA/general/hotline/95report/05_95mhr.txt.html HTTP/1.0', 'code': '200', 'nbytes': '56431'}
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:55:29', 'request': 'GET /docs/Access HTTP/1.0', 'code': '302', 'nbytes': '-'}
    {'host': '140.112.68.165', 'timestamp': '29:23:55:33', 'request': 'GET /logos/us-flag.gif HTTP/1.0', 'code': '200', 'nbytes': '2788'}
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:56:14', 'request': 'GET /Access/images/epaseal.gif HTTP/1.0', 'code': '200', 'nbytes': '2624'}
    {'host': 'tanuki.twics.com', 'timestamp': '29:23:56:24', 'request': 'GET /OSWRCRA/general/hotline/95report/ HTTP/1.0', 'code': '200', 'nbytes': '1250'}
    {'host': 'freenet2.carleton.ca', 'timestamp': '29:23:56:36', 'request': 'GET /emap/html/regions/four/ HTTP/1.0', 'code': '200', 'nbytes': '15173'}
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:57:05', 'request': 'GET /waisicons/unknown.gif HTTP/1.0', 'code': '200', 'nbytes': '83'}
    {'host': 'ix-mia5-17.ix.netcom.com', 'timestamp': '29:23:57:06', 'request': 'GET /OWOW/ HTTP/1.0', 'code': '200', 'nbytes': '1501'}
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:57:08', 'request': 'POST /cgi-bin/waisgate/134.67.99.11=earth1.epa.gov=210=/indexes/ACCESS=gopher%40earth1.epa.gov=0.00=:free HTTP/1.0', 'code': '200', 'nbytes': '26217'}
    {'host': 'wpbfl2-45.gate.net', 'timestamp': '29:23:57:12', 'request': 'GET /waisicons/text.xbm HTTP/1.0', 'code': '200', 'nbytes': '527'}
    {'host': 'ix-knx-tn1-22.ix.netcom.com', 'timestamp': '29:23:57:28', 'request': 'GET / HTTP/1.0', 'code': '200', 'nbytes': '4889'}
    Citation Envoyé par Sve@r Voir le message
    Une 3° solution serait de créer une fonction plus complexe que le basique split qui analyse la ligne pour considérer toute chaine entre guillemets comme unique et non splittable. Fonction à écrire soi-même bien évidemment.
    sauf que si on se contente de compter les guillemets/parenthèses/crochets/etc. on ouvre la porte aux injections dans le log, faut pas oublier que la requête vient de l'internaute directement...

  6. #6
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Octobre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Octobre 2018
    Messages : 9
    Par défaut
    Merci pour votre aide.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    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 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    sauf que si on se contente de compter les guillemets/parenthèses/crochets/etc. on ouvre la porte aux injections dans le log, faut pas oublier que la requête vient de l'internaute directement...
    Ben je sais pas trop comment tu vois la chose. On "lit" le log, on ne l'interprète pas quoi.

    A titre d'exemple, j'ai créé un fichiet texte contenant juste une ligne eval("5"). J'ai ouvert le fichier, lu la ligne, stocké cette ligne dans une variable "x". Ben je peux afficher "x" tant que je veux, je n'obtiens à chaque fois que 'eval("5")' (note bien les quotes de début et de fin). Et l'instruction 5 == x renvoie False car "x" n'est pas "exécuté".
    Il faut que je demande explicitement eval(x) pour avoir au final 5 mais cet ordre vient de moi, pas de l'internaute...
    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]

  8. #8
    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 Sve@r Voir le message
    On "lit" le log, on ne l'interprète pas quoi.
    classiquement oui, c'est sans compter sur certaines attaques spécifiques, pour le dire simplement si tu "lis" ton log avec less par exemple, il me semble que par défaut il interprète les séquences ANSI, du coup selon ce que tu injectes dans la ligne de log ça peut être exécuté

    d'autre part et sans parler d'exécution, sur des logs de quelques Ko passe encore, mais dans les grosses entreprises on ne lit pas directement le log à la mimine, c'est mouliné par un corrélateur d'évènements qui lui aussi a pour tâche un moment donné de récupérer la requête, si on fraude la ligne de log en mettant un guillemet double en plein milieu l'outil peut penser que la requête est finie et louper une partie des données, voire carrément se vautrer (tout dépend comment c'est codé, mais si je t'en parle c'est qu'en l'occurrence j'ai déjà eu le cas )

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

Discussions similaires

  1. Comment imprimer un fichier text existant?
    Par AODRENN dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2005, 17h26
  2. Comment générer un fichier texte à partir d'un XML et XSL
    Par Jayceblaster dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/07/2005, 22h42
  3. Réponses: 5
    Dernier message: 16/07/2005, 00h01
  4. Comment créer un fichier texte?
    Par Crazynoss dans le forum ASP
    Réponses: 2
    Dernier message: 08/05/2005, 19h53
  5. Comment écrire un fichier texte au format MS-DOS ?
    Par fredfred dans le forum Langage
    Réponses: 9
    Dernier message: 20/01/2005, 09h00

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