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 de fichiers


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 63
    Par défaut Concatenation de fichiers
    Salut salut !
    Je débute en Python et je souhaite concaténer deux fichiers en 1 seul suivant certaines conditions.

    Voiçi mes 2 fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    file1:
    toto tata 123
    foo bar 456
    truc machin 789
     
    file2:
    toto tata 321
    bidule machin 753
    Je souhaite les concaténer de façon à ce que les valeurs associées à chaque ligne correspondent (voilà ce à quoi je devrais m'attendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    outfile:
    toto tata 123 321
    foor bar 456 0
    truc machin 789 0
    bidule machin 0 753

    Mon code fonctionne plutôt bien quand la ligne est présente dans infile2 et pas dans infile1 mais ne fonctionne pas dans l'autre sens. De plus je dois effectuer ce traitement sur des fichiers relativements grands (>10M lignes).

    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
     
    def concatenate(infile1, infile2, outfile):
     
    	dict1=dict()
     
    	with open(outfile, "w+") as out:
    		with open(infile1, "r") as in1:
    			for line in in1:
    				line=re.split("\s+", line)
    				dict1[line[0]+line[1]]=line[2]
     
    		with open(infile2, "r") as in2:
    			for line in in2:
    				line=re.split("\s+", line)
    				if dict1.get(line[0]+line[1]) != None:
    					print_file(out, line[0], line[1], dict1[line[0]+line[1]], line[2])					
    				else:
    					print_file(out, line[0], line[1], 0, line[2])
     
    def print_file(f, string1, string2, int1, int2):
    	f.write("%s\t%s\t%d\t%s\n" %(string1, string2, int(int1), int(int2)))
     
    concatenate("test1", "test2", "out.txt")
    Comme vous pouvez le voir je boucle sur un dictionnaire pour identifier ou non la présence d'une ligne dans l'autre fichier. Je pourrais résoudre mon problème en créant un second dictionnaire et en comparant les deux mais comme je dois effectuer ceci pour de grand fichiers ce n'est pas très adapté...

    Si vous pouviez m'aider ça me dépannerait

    Merci à vous

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Voici un code générique qui ne sera sans doute pas des plus rapides, mais qui au moins n'explosera pas la mémoire avec des gros fichiers :

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
     
    def concatenate(infile1, infile2, outfile):
     
        with open(outfile, "w") as out:
     
            with open(infile1) as in1:
     
                with open(infile2) as in2:
     
                    for line1 in in1:
     
                        chunks1 = line1.split()
     
                        in2.seek(0)
     
                        new_value = 0
     
                        for line2 in in2:
     
                            chunks2 = line2.split()
     
                            if chunks1[:2] == chunks2[:2]:
     
                                new_value = chunks2[-1]
     
                                break
     
                            # end if
     
                        # end for - in2
     
                        chunks1.append(str(new_value))
     
                        out.write(" ".join(chunks1) + "\n")
     
                    # end for - in1
     
                    in2.seek(0)
     
                    for line2 in in2:
     
                        chunks2 = line2.split()
     
                        found = False
     
                        in1.seek(0)
     
                        for line1 in in1:
     
                            chunks1 = line1.split()
     
                            if chunks2[:2] == chunks1[:2]:
     
                                found = True
     
                                break
     
                            # end if
     
                        # end for - in1
     
                        if not found:
     
                            chunks2.insert(2, "0")
     
                            out.write(" ".join(chunks2) + "\n")
     
                        # end if
     
                    # end for - in2
     
                # end with - in2
     
            # end with - in1
     
        # end with - out
     
        print("concatenate : done. OK.")
     
    # end def
     
    concatenate("test1", "test2", "out.txt")
    @+.
    Dernière modification par Invité ; 12/06/2014 à 22h51. Motif: Inutile de citer entièrement le message précédent

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 63
    Par défaut
    Merci à toi, je vais tâcher de comprendre le fonctionnement maintenant merci

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    On peut faire une fonction plus générique (avec plus de deux fichiers à concaténer par exemple) en utilisant une classe spécifique comme fileinput et sa méthode input...

Discussions similaires

  1. Concaténer deux fichiers Ligne/Ligne avec SH
    Par guiltouf dans le forum Linux
    Réponses: 7
    Dernier message: 22/05/2007, 14h35
  2. Concaténer plusieurs fichier pdf.
    Par gege2061 dans le forum Linux
    Réponses: 7
    Dernier message: 28/10/2006, 13h14
  3. Supprimer les dernieres lignes et concatener plusieurs fichier
    Par filsdugrand dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 11/04/2006, 21h15
  4. Concaténation de fichiers sous UNIX?
    Par airmax77 dans le forum Linux
    Réponses: 4
    Dernier message: 27/01/2006, 16h23
  5. [Script .BAT] Concatenation de fichiers plats
    Par Jokeur dans le forum Autres langages
    Réponses: 1
    Dernier message: 03/05/2005, 12h14

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