J'ai donné une solution, tu l'as regardé et testé ?
Version imprimable
J'ai donné une solution, tu l'as regardé et testé ?
Ne penses-tu pas que "doublon" devrait être réinitialisé pour toute nouvelle ligne de fic1 ??? Accessoirement puisqu'il est à "n" par défaut, et qu'on sort de la boucle quand il passe à "o", inutile alors de le remettre à "n" à chaque ligne lue de fic2. On le met à "n" au départ, s'il passe à "o" on sort de la boucle et puis c'est tout.
PS: il existe la structure "for...else" qui permet de s'affranchir de ce genre de variable.
Exemple avec variable
Code:
1
2
3
4
5
6
7
8
9
10
11
12 flag=False for x in data: if trouve(x): flag=True break # if # for if flag: print "Element trouvé" else: print "Element pas trouvé" # if
Exemple avec for... else
Code:
1
2
3
4
5
6
7
8 for x in data: if trouve(x): print "Element trouvé" break # if else: print "Element pas trouvé" # for
L'importance c'est de ne pas avoir de traitements qui durent des minutes alors qu'ils pourraient durer quelques secondes ; de ne pas avoir de traitements qui durent des heures alors qu'ils pourraient durer quelques minutes ; de ne pas avoir de traitements qui durent des jours alors qu'ils pourraient durer quelques heures ; de ne pas avoir de traitements qui durent des années alors qu'ils pourraient durer quelques jours. Si l'équipe de Turing avait pensé comme toi quand ils se sont attaqués à Enigma, la seconde guerre mondiale aurait duré 2 ans de plus.
On peut essayer, en fonction de ce que l'on cherche dans le fichier en question, d'utiliser comme cle du dictionnaire le contenu de la ligne / l'info que l'on cherche.
dict = { XXX: " " for XXX in notre fichier }
et ensuite, en lisant le deuxieme fichier, faire un if XXX in dict.
Beaucoup plus rapide, j'ai teste ca il y a quelques semaines sur des fichiers de 80 millions de lignes avec un resultat tout a fait satisfaisant.
Passer par des ensembles en utilisant set est aussi une option tres interressante.
Hum, je fais ici une hypothèse que la rapidité dont tu parles (O(1) déjà cité) soit liée au fait que les clefs sont uniques, chose qu'on n'a pas forcément avec les tuples et les listes.
Toutefois un dictionnaire est quand-même un objet assez lourd. Il y a par exemple la conversion de clef en indice (parce qu'au bout d'un dico il n'y a au final qu'un bête tableau), la gestion des cas où deux clefs distinctes donnent le même indice, etc.
Or les set() sont des listes à contenu unique. Donc à mon avis la recherche dans les set() offrira le même avantage en O(1) sans avoir l'inconvénient de la lourdeur d'un dico. Qu'en penses-tu ?
En gros la ligne de ton fichier sert de clé au dico et tu mets n'importe quoi en valeur ? L'idée est tentante pour une recherche grâce à la fonction de hash.
Svear souleve une possibilité intéressante avec le set. Faudrait tester :)
j'aimerai comprendre ce code
Ou et comme ce définie la variable data....Code:
1
2
3
4
5
6
7
8 for x in data: if trouve(x): print "Element trouvé" break # if else: print "Element pas trouvé" # for
Rien ne défini data donc en l'état ce morceau de code me reste difficile a comprendre.
Pour autant je subodore que si data est une liste cela a du sens.
Code:
1
2
3
4
5
6
7
8
9
10
11 data =['lundi', 'mardi' , 'mercredi', 'jeudi' , 'vendredi', 'samedi', 'dimanche'] for x in data: if trouve('mercredi'): print "Element mercredi trouvé" break # if else: print "Element pas trouvé" # for
voici une idee interessant
Cette version est presque parfaite sauf que le résultat est sur une seul ligneCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 a = ["a", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"] b = {"quick", "brown"} c = [x for x in a if not x in b] print (c) # liste a a = [ ["d", "e", "f"], ["g", "h", "i"], ["g", "h", "i"], ["x", "y", "z"] ] # liste b b = [ ["a", "b", "c"], ["a", "b", "c"], ["d", "e", "e"], ["x", "y", "z"] ] # c permet de comparer sous liste par sous liste a et b # n'est conservé sous liste de a celle absente de b c = [x for x in a if not x in b] print (c)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 destination = open("Resultat.csv", "w") f1 = open"f1ori.csv", "r") f2 =open("f2.csv", "r") try: file1_raw = f1.read() file2_raw = f1.read() file1_words = file1_raw.split() file2_words = file2_raw.split() result = set(file1_words).difference(set(file2_words)) resutat = [x for x in file1_words if not x in file2_words] destination.writelines(resutat) finally: destination.close() f1.close() f2.close()
j'ai donc modifier le code ainsi
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 destination = open("Resultat.csv", "w") f1 = open"f1ori.csv", "r") f2 =open("f2.csv", "r") try: file1_raw = f1.read() file2_raw = f1.read() file1_words = file1_raw.split() file2_words = file2_raw.split() result = set(file1_words).difference(set(file2_words)) resutat = [x for x in file1_words if not x in file2_words] #destination.writelines(resutat) for x in resutat: destination.write(x) destination.write("\n") finally: destination.close() f1.close() f2.close()
exemple de fichier f1ori.csv
Jacque;frederic;id15;1cc30806;1;az908;TPSB;000000007000;20170201;20171231;2017-01-09 22:56:35.817;20170106;124
jean;marcle;id33;1aa30406;1;az980;TPSB;0000000070100;20170201;20171231;2017-01-09 22:56:35.817;20170106;122
maxi;cheril;id13;1bb30406;1;az980;TPSB;0000000070100;20170201;20171231;2017-01-09 22:56:35.817;20170106;122
Pourquoi le fichier résultat a cette apparence?
Jacque;frederic;id15;1cc30806;1;az908;TPSB;000000007000;20170201;20171231;2017-01-09
22:56:35.817;20170106;124
jean;marcle;id33;1aa30406;1;az980;TPSB;0000000070100;20170201;20171231;2017-01-09
22:56:35.817;20170106;122
maxi
cheril;id13;1bb30406;1;az980;TPSB;0000000070100;20170201;20171231;2017-01-09 22:56:35.817;20170106;122
Pourquoi ne retrouvons nous pas l'organisation du fichier d'origne
en quantité donnes et en logique de programme cela me semble plus cohérent , je n'ai pas vérifer le détail des donnees
Il s'agit d'un code minimaliste destiné à illustrer le fonctionnement de la structure for...else. Mais bien entendu il s'adresse à quelqu'un ayant suffisament de bases Python pour comprendre que dans cet exemple, data n'a pas d'importance et que c'est à l'utilisateur de le remplacer par ce qu'il veut (tant que ça reste itérable). Accessoirement il sera nécessaire de définir aussi la fonction "trouve()"...
Voilà, t'as trouvé. Ca fonctionne aussi si "data" est une chaine, un générateur, bref un truc itérable dans lequel on veut chercher une info précise.
Ben en programmation, c'est aussi à toi de gérer la façon dont tu veux afficher ton résultat :roll:
Es-tu vraiment développeur en informatique ???
Parce que tu as mal découpé tes lignes (va te documenter sur le fonctionnement de la fonction split()).
Voici le code finale
sur un version de quelques enregistrements extrait des fichiers cela marche
sur les fichiers d'origine il ne retourne rien
Code:
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 destination = open("Resultat2.csv", "w") f1 = open("F1.csv", "r") f2 = open("F2.csv", "r") #lecture global des donnees du fichier try: file1_raw = f1.read() #lecture global des donnees du fichier file2_raw = f2.read() #lecture global des donnees du fichier file1_words = file1_raw.split("\n") # Découpage selon le caractère de fin de ligne file2_words = file2_raw.split("\n") # Découpage selon le caractère de fin de ligne result = set(file1_words).difference(set(file2_words)) resutat = [x for x in file1_words if not x in file2_words] #destination.writelines(resutat) for x in resutat: destination.write(x) destination.write("\n") finally: destination.close() f1.close()
C'est normal. Parce que ta lecture est mauvaise.
Tu lis un fichier texte (donc un fichier sensé être traité ligne par ligne) mais tu le lis par read(). Mais read() ne lit pas de lignes, il lit des blocs de n octets. Et donc rien ne garantit que les blocs lus se juxtaposeront pile poil sur les lignes du fichier.
Exemple: si ton fichier contient(2 lignes)Citation:
Les sanglots longs des violons de l'automne
Bercent mon coeur d'une langueur monotone
Si tu lis via read(), peut-être que tu obtiendras Les sanglots longs des violons de l'automne\nBercent mon c puis ensuite oeur d'une langueur monotone. Et là, ben ton split("\n") marche mais tu n'as que la moitié du second vers.
Alors traiter un fichier texte en passant par read() et en recollant les morceaux est faisable mais c'est beaucoup d'efforts pour pas grand chose parce que tu as des outils plus adéquats. Tu as par exemple readline() qui te lit ton fichier ligne par ligne (elle te la renvoie sous forme de chaine). Tu as aussi readlines() qui te lit tout ton fichier d'un coup (elle te les renvoie sous forme d'un tableau). Et sinon comme le fichier est lui-même un itérable (la notion d'itérable est omniprésente dans le monde Python), tu peux tout à fait écrire for ligne1 in f1: ... comme tu l'as fait au début.
J'ai l'impression que tu pars dans tous les sens. alors que ton souci ne vient pas de la façon dont tu lis tes lignes mais de la façon dont tu les exploites. Donc repars de ton code initial et adapte ensuite ton traitement...
Alors ceci ne doit être mieux
cette solution semble fonctionnelle sur des fichiers de quelque enregistrement.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 # -*- coding: cp1252 -*- destination = open("Resultat2.csv", "w") destination2 = open("Resultat3.csv", "w") f1 = open("F1.csv", "r") f2 = open("F2.csv", "r") try: file1 = f1.readlines() #charger tous le fichier file2 = f2.readlines() #charger tous le fichier resultat = set(file1).difference(set(file2)) destination.writelines(resultat) resultat2 = [x for x in file1 if not x in file2] destination2.writelines(resultat2) finally: destination.close() destination2.close() f1.close() f2.close()
mais avec des fichiers de 50.000 lignes etrangements cela ce donne rien?
Voir la réponse de Wiztricks (j'avais dit aussi la même chose ici).
Maintenant, tu peux vérifier cette hypothèse par le petit script suivant:
Au final, tu auras chaque n° de ligne de F1.csv avec sa position dans "f2.csv" (ou bien "None" si la ligne n'y est pas). Et donc si tu n'as aucun "None" ça veut dire que toutes les lignes de F2 sont dans F1 (et tu sauras où)...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 with open("a", "r") as file_base: with open("b", "r") as file_ref: ref=tuple(file_ref) for (i, l) in enumerate(file_base, 1): try: where=ref.index(l) + 1 except ValueError: where=None print "ligne %s f1 at pos %s dans f2" % ( i, where, ) # for # with
PAs de bug
Quand a ceciCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 # -*- coding: cp1252 -*- destination = open("Resultat1.csv" , "w") destination2 = open("Resultat2.csv" , "w") f1 = open("a", "r") f2 = open("b", "r") try: file1 = f1.readlines() #charger tous le fichier file2 = f2.readlines() #charger tous le fichier resultat = set(file1).difference(set(file2)) destination.writelines(resultat) resultat2 = [x for x in file1 if not x in file2] destination2.writelines(resultat2) finally: destination.close() destination2.close() f1.close() f2.close()
voila le résultat:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 with open("a", "r") as file_base: with open("b", "r") as file_ref: ref=tuple(file_ref) for (i, l) in enumerate(file_base, 1): try: where=ref.index(l) + 1 except ValueError: where=None print ("ligne %s f1 at pos %s dans f2" % ( i, where, )) # for # with
ligne 680 f1 at pos 9694 dans f2
ligne 681 f1 at pos 9697 dans f2
ligne 682 f1 at pos 9698 dans f2
ligne 683 f1 at pos 9713 dans f2
ligne 684 f1 at pos 9714 dans f2
ligne 685 f1 at pos 9731 dans f2
ligne 686 f1 at pos 9732 dans f2
ligne 687 f1 at pos 9763 dans f2
..ligne 3192 f1 at pos 43128 dans f2
ligne 3193 f1 at pos 43129 dans f2
ligne 3194 f1 at pos 43130 dans f2
ligne 3195 f1 at pos 43131 dans f2
ligne 3196 f1 at pos 43132 dans f2
ligne 3197 f1 at pos 43133 dans f2
ligne 3198 f1 at pos 43134 dans f2
ligne 3199 f1 at pos 43137 dans f2
ligne 3200 f1 at pos 43138 dans f2