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 :

Découpe d'un fichier .txt ligne après ligne


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juin 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juin 2016
    Messages : 9
    Par défaut Découpe d'un fichier .txt ligne après ligne
    Bonjour à tous,

    Je bloque sur un script Python que je n'arrive pas à formuler correctement.
    Je cherche à automatiser la découpe d'un fichier .txt ligne après ligne en indiquant les plages de valeur.

    exemple de fichier .txt
    tititototata...

    Après traitement par le script, j'aurais une liste
    ['titi', 'toto', 'tata', ....]


    J'ai réussi à faire en partie cette étape:
    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
     
    #création du dictionnaire contenant les plages de valeur
    dicoSlice = {0:2,2:8,8:13,13:30,30:35,35:52}
    #création d'une liste pour récupérer les données traitées
    listeSlice = []
     
    #ouverture du fichier
    mon_fichier = open("donnees.txt", "r")
    #récupération des lignes dans une liste
    contenu = [line.strip('\n') for line in mon_fichier.readlines()]
    fichier = [[line] for line in contenu]
    mon_fichier.close()
     
    #Création d'une boucle imbriquée pour réaliser le découpage des données
    for chaine in fichier:
        for cle,valeur in dicoSlice.items():
            ligne = chaine[0][cle:valeur]
            listeSlice.append(ligne)
    Pour une ligne le script fait le job. J'ai bien une liste avec les valeurs découpées en fonction des plages données dans le dictionnaire.

    Par contre, quand je dois traiter plusieurs lignes, un problème se pose. Je récupère l'ensemble des lignes dans la même liste.

    Je cherche donc à créer autant de liste que de ligne. J'ai trouvé cette fonction qui me permet de faire un dictionnaire de liste en me basant sur le nombre de ligne. Par contre, je n'arrive pas à passer une ligne par liste.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def createList(name, n):
        result = {}
        for i in range(n):
            nameList = name + str(i+1)
            result[nameList] = []
        return result
     
    res = createList("list", len(fichier))

    cordialement,

    romain

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

    Citation Envoyé par rom94000 Voir le message
    Par contre, quand je dois traiter plusieurs lignes, un problème se pose. Je récupère l'ensemble des lignes dans la même liste.
    A chaque itération, il faut créer une liste, la remplir en fonction du contenu de la ligne puis ajouter cette liste à la liste de listes.

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

  3. #3
    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
    Bonjour,

    Heureusement, python sait faire plein de choses pour éviter de refaire la roue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from textwrap import wrap
     
    TEST = "tititototata"
     
    result = wrap(TEST, width=4)
    print(result)  # ['titi', 'toto', 'tata']

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 4
    Par défaut
    Tout d'abord, il me paraîtrait plus logique et plus simple de définir les plages par une liste de couples de valeurs que par un dictionnaire... mais c'est tout personnel.
    Ensuite, la création de ta variable "fichier" ne me paraît pas indispensable : tu rajoutes une structure de liste de listes... dont tu ne te sers pas !
    Enfin, pour résoudre ton problème, il suffit de créer une nouvelle liste à chaque ligne au lieu de tout mettre dans une seule liste.

    Si on conserve ta structure originale, cela donne :

    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
    #création du dictionnaire contenant les plages de valeur
    dicoSlice = {0:2,2:8,8:13,13:30,30:35,35:52}
    #création d'une liste pour récupérer les données traitées
    listeSlice = []
     
    #ouverture du fichier
    mon_fichier = open("donnees.txt", "r")
    #récupération des lignes dans une liste
    contenu = [line.strip('\n') for line in mon_fichier.readlines()]
    mon_fichier.close()
     
    #Découpage des données
    for ligne in fichier:
        ligne_decoupee= [ligne[cle:valeur] for cle,valeur in dicoSlice.items()]
        listeSlice.append(ligne_decoupee)
    Ci-dessous, jadopte la liste de couples suggérée plus haut pour donner les plages de valeurs et j'utilise également la méthode "with ... " pour lire le fichier.
    Enfin, je crée la liste de lignes découpées d'un seul coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #création d'une liste contenant les plages de valeur
    slices = [(0,2), (2,8), (8,13), (13,30), (30,35), (35,52)]
     
    #récupération des lignes dans une liste
    with open("donnees.txt", "r") as mon_fichier:
        contenu = [line.strip('\n') for line in mon_fichier.readlines()]
     
    #Découpage des données
    listeSlice = [[ligne[debut:fin] for (debut,fin) in slices] for ligne in fichier]

Discussions similaires

  1. [AC-2000] Export Access vers fichier txt ligne à ligne
    Par jorge54 dans le forum VBA Access
    Réponses: 14
    Dernier message: 23/01/2010, 02h15
  2. Fichier txt - ligne par ligne
    Par thomasgm dans le forum Débuter
    Réponses: 1
    Dernier message: 27/12/2007, 23h59
  3. Comment lire un fichier txt ligne par ligne ?
    Par Chikh001 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/11/2007, 09h27
  4. lire un fichier .txt ligne par ligne
    Par 7awela dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 07/06/2007, 17h02
  5. lecture d'un fichier txt ligne par ligne
    Par SoBaKa dans le forum Général Python
    Réponses: 4
    Dernier message: 06/03/2007, 12h02

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