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 :

Concatenation fichier txt


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2021
    Messages : 11
    Par défaut Concatenation fichier txt
    Bonjour,

    Je viens de faire un programme python qui permette de concatener plusieurs fichiers TXT.

    L'idée de ce programme est de construire un fichier "Merged_file" qui regroupe tous les fichiers TXT d'un dossier préalablement ciblé.

    Mon souci réside dans la gestion des retours à la ligne. En effet, les blocs TXT ont tendances à se chevaucher une fois sur deux.

    Ajouter outfile.write("\n") dans le code génère une fois sur deux des lignes vides.

    Avez-vous une idée ?

    Voici le code:

    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
     
    import os
    # find all the txt files in the dataset folder
    inputs = []
    n=0
    path = "/Users/Nicolas/Desktop/Python/test/"
    for file in os.listdir(path):
        if file.endswith(".txt"):
            inputs.append(file)
            n=n+1
     
    # concatanate all txt files in a file called merged_file.txt
    with open('/Users/Nicolas/Desktop/Python/merged_file.txt', 'w') as outfile:
        for fname in inputs:
            with open(fname, encoding="utf-8", errors='ignore') as infile:
                for line in infile:
                    outfile.write(line)
     
    print("The program has concatenated",n,"files")

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

    Citation Envoyé par nico29830 Voir le message
    Mon souci réside dans la gestion des retours à la ligne. En effet, les blocs TXT ont tendances à se chevaucher une fois sur deux.
    Ce sont les retours à la ligne qui fabriquent les lignes et... si on omet de mettre un retour à la ligne pour la dernière ligne, la première ligne du fichier suivant viendra s'y coller.
    A vous de tester cette théorie et de voir si tester si la dernière ligne se termine bien par une fin de ligne pour l'ajouter sinon résout votre problème.

    - 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 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 nico29830 Voir le message
    Avez-vous une idée ?
    cat /Users/Nicolas/Desktop/Python/test/*.txt >/Users/Nicolas/Desktop/Python/merged_file.txt. Ben oui, Python à beau être un super langage, il y a quand-même parfois des moments où il a le droit de laisser la place au shell quand celui-ci est plus efficace.
    Mais bon, imaginons que ce soit pour le plaisir de l'écrire en Python... ben malheureusement je ne vois rien qui cloche dans ton code. Je l'ai pris, mis chez-moi, il a fonctionné nickel. Peut-être que la faute serait à chercher du côté des fichiers textes. Par exemple sont-ils vraiment des fichiers textes complets? J'ai parfois eu des surprises avec des trucs que j'ouvrais avec "gvim" et qui me disait "noeol"...

    Ensuite si tu veux l'optimiser, déjà tu peux lui enlever cette variable "n" qui ne sert à rien (info disponible dans len(inputs)) mais surtout tu peux même supprimer la boucle for line in infile en remplaçant par un simple outfile.write(infile.read()). Et tu peux créer l'input de façon plus directe de cette façon inputs=[f for f in os.listdir(...) if f.endswith(".txt")]. Evite d'ailleurs d'utiliser des variables de même nom que les types Python (comme ta variable "file" par exemple).

    PS: bien entendu, l'instruction os.listdir(".") te retourne les fichiers récupérés dans l'ordre tels qu'ils sont stockés dans le dossier (probablement par leur ancienneté de création) et non pas dans un ordre plus "humanisé" (comme par exemple l'ordre alphabétique ou autre). Hé oui, faut pas oublier les secrets de l'inode...
    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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2021
    Messages : 11
    Par défaut
    Merci beaucoup Sve@r, wiztricks,

    Effectivement la solution du Shell est impressionnante. Je connaissais pas cette fonction cat :o

    J'ai ajouté un '\n' dans la fonction outfile.write pour revenir à la ligne à chaque concatenation.

    Le seul hic c'est que maintenant j'ai une ligne vide au début de mon TXT mais je ne vois pas de solution à ça.

    En tout cas, merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import os
     
    path = '/Users/Nicolas/Desktop/Python/Concatenation_PY/'
     
    inputs=[f for f in os.listdir(path + '/Drop files/') if f.endswith('.txt')]
     
    with open(path + 'Output.txt', 'w') as outfile:
        for fname in inputs:
            with open(path + '/Drop files/' + fname, encoding='utf-8', errors='ignore') as infile:
                outfile.write('\n' + infile.read())
     
    print("The program has concatenated",len(inputs),"files")

  5. #5
    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 nico29830 Voir le message
    Effectivement la solution du Shell est impressionnante. Je connaissais pas cette fonction cat :o
    Hum... si tu bosses sous Unixoïde, tu devrais t'intéresser aux outils qu'il offre. Unix a été fait pour le texte. Toute sa configuration, toute son administration ne se fait qu'avec des fichiers textes (à tel point qu'on peut l'administrer rien qu'avec du "gvim" et du "mkdir"). Et donc il offre en retour des outils pour manipuler le texte dans tous les sens (cat, tac, cut, sed, grep, awk, tr). Tu devrais essayer par exemple "tac" tu verras, le résultat sera intéressant (même syntaxe que pour "cat" => tac /Users/Nicolas/Desktop/Python/test/*.txt >/Users/Nicolas/Desktop/Python/merged_file.txt).

    Citation Envoyé par nico29830 Voir le message
    J'ai ajouté un '\n' dans la fonction outfile.write pour revenir à la ligne à chaque concatenation.

    Le seul hic c'est que maintenant j'ai une ligne vide au début de mon TXT mais je ne vois pas de solution à ça.
    Il faut essayer d'être plus précis. Si tu veux juste concaténer (oui, le programme "cat" tire son nom du mot "concaténation") simplement les fichiers les uns à la suite des autres, ton premier programme était parfait.
    Si maintenant tu veux "habiller" cette concaténation en rajoutant entre chaque fichier un titre, un souligné, une pagination, une date, n'importe quoi là ce n'est plus la même chose. Là ça devient de la programmation selon contexte. Il te faut alors programmer un algo style "je lis un fichier, puis je rajoute mon habillage, puis si ce n'est pas le dernier fichier je rajoute une ligne vide" etc etc etc...
    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]

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

    Citation Envoyé par nico29830 Voir le message
    J'ai ajouté un '\n' dans la fonction outfile.write pour revenir à la ligne à chaque concatenation.
    Il ne faut l'ajouter que lorsque c'est nécessaire i.e. quand la dernière ligne du fichier ne se termine pas par fin de ligne (\n)... et si on lit tout le fichier d'un seul coup (avec .read), il se termine ou pas par fin de ligne mais si vous ne testez pas, vous allez ajouter des lignes vides où il n'y en a pas besoin.

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

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2021
    Messages : 11
    Par défaut
    Bonjour Wiztricks, Sve@r,

    J'ai ajouté le test "if fname != LastInput:" et maintenant ça fonctionne à merveille.

    @Sve@r: Je ne sais pas pourquoi mais la fonction tac ne marche pas.

    cat /Users/Nicolas/Desktop/Python/Concatenation_Shell/Dropfiles/*.txt >/Users/Nicolas/Desktop/Python/Concatenation_Shell/Output.txt => Fonctionne
    tac /Users/Nicolas/Desktop/Python/Concatenation_Shell/Dropfiles/*.txt >/Users/Nicolas/Desktop/Python/Concatenation_Shell/Output.txt => Message d'erreur

    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
     
    import os
     
    path = '/Users/Nicolas/Desktop/Python/Concatenation_PY/'
     
    inputs=[f for f in os.listdir(path + '/Drop files/') if f.endswith('.txt')]
    LastInput= inputs[-1]
     
    with open(path + 'Output.txt', 'w') as outfile:
        for fname in inputs:
            with open(path + '/Drop files/' + fname, encoding='utf-8', errors='ignore') as infile:
                if fname != LastInput:    
                    outfile.write(infile.read()+ '\n')
                outfile.write(infile.read())
     
    print("The program has concatenated",len(inputs),"files")

  8. #8
    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 nico29830 Voir le message
    J'ai ajouté le test "if fname != LastInput:" et maintenant ça fonctionne à merveille.
    Ah l'enthousiasme du premier programme réussi. Pourquoi faire deux fois outfile.write() pour gérer un simple "\n"? Et as-tu remarqué que tu pouvais aussi utiliser directement inputs[-1] ???...

    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
    import os
     
    path=os.path.join(os.path.expanduser("~"), "Desktop", "Python", "Concatenation_PY")
    path_i=os.path.join(path, "Drop files")
     
    inputs=tuple(f for f in os.listdir(path_i) if f.endswith('.txt'))	# Si la liste n'évolue pas, alors autant passer par un tuple plus économique
     
    with open(os.path.join(path, 'Output.txt'), 'w') as outfile:
    	for (i, fname) in enumerate(inputs, 1):
    		with open(os.path.join(path_i, fname), "r", encoding='utf-8', errors='ignore') as infile:
    			if i > 1: print("", file=outfile)
    			outfile.write(infile.read())
    		# with
    	# for
    # with
     
    print("The program has concatenated {} file{}".format(i, "s" if i > 1 else ""))
    Pour le "tac" (déjà ce n'est pas une fonction mais un programme) si le message d'erreur c'est "bash: tac: commande introuvable" cela veut dire que ce programme ne se trouve pas sur ton système (ce qui est bizarre car c'est un programme maintenant assez bien répandu). Sinon avoir le message d'erreur eut été intéressant..
    Bon on va pas insister sur ce détail. En fait "cat" affiche (concatène) un fichier à l'écran et "tac" (qui est "cat" à l'envers) le concatène dans l'autre sens (de la fin vers le début). Petit trait d'humour des créateurs de Linux...
    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]

Discussions similaires

  1. Concatenation fichiers txt
    Par Jean-Matt dans le forum Langage
    Réponses: 2
    Dernier message: 29/09/2009, 12h20
  2. Concatenation de 7 fichiers .txt en 1 seul puis tri
    Par lanfou dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 17/08/2006, 11h48
  3. ouverture de fichier txt
    Par juguul dans le forum MFC
    Réponses: 11
    Dernier message: 18/12/2003, 09h44
  4. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08
  5. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19

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