bonjour j'aimerai faire un genrerateur oun plutot un dictionaire de numero telephone en python en gros
un txt avec tout les 01 et06----etc 09 possible
Version imprimable
bonjour j'aimerai faire un genrerateur oun plutot un dictionaire de numero telephone en python en gros
un txt avec tout les 01 et06----etc 09 possible
Voila se que jai deja fais je vai tester
Code:
1
2
3
4
5
6 #!/usr/bin/python fichier = open('list.txt', 'w') for icila in ["0%d" % i for i in range(9999999, 99999999)]: fichier.write(icila+"\n") fichier.close()
Bonjour,
Une idée:
C'est un peu rustique, mais ça a l'air de faire le boulot...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 for i1 in xrange(01,100): for i2 in xrange(01,100): for i3 in xrange(01,100): for i4 in xrange(01,100): for i5 in xrange(01,100): print "%02d%02d%02d%02d%02d" % (i1,i2,i3,i4,i5) 0101010101 0101010102 0101010103 0101010104 0101010105 0101010106 0101010107 0101010108 ... 0101072367 0101072368 0101072369 0101072370 0101072371 ...
Bonsoir,
pourriez vous être plus clair?
?. Les contraintes sur les numéros:Citation:
tout les 01 et06----etc 09 possible
-commencent par des 06/01 ..?
-se terminent par des XX?
-se composent de n chiffres...
Des exemples de numéros.
:mrgreen:
Bonsoir,
Note: C'est pratique ça pour du spam avec des sms illimités (merci les opérateurs)...
Pourquoi générer cela neops ?
@+
Bonjour,
+ une dose de patience.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 with open('list.txt', 'w') as l: for indicatif in ['01', '02', '03', '04', '05', '09']: # 01 : Region parisienne # 02 : Region nord-ouest / Ocean Indien # 03 : Region nord-est # 04 : Region sud-est # 05 : Region sud-ouest / Ocean Atlantique # 09 : Box internet # On evite ici # 06/07 : Mobiles # 08 : Tarification speciale n = 1 # range trop grand pour un for, on utilise while. while n < 100000000: l.write(indicatif+(8-len(str(n)))*"0"+str(n)+"\n") n += 1
Si l'ordre n'importe pas
On evite x passage.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 with open('list.txt', 'w') as l: n = 1 # range trop grand pour un for, on utilise while. while n < 100000000: for indicatif in ['01', '02', '03', '04', '05', '09']: # 01 : Region parisienne # 02 : Region nord-ouest / Ocean Indien # 03 : Region nord-est # 04 : Region sud-est # 05 : Region sud-ouest / Ocean Atlantique # 09 : Box internet # On evite ici # 06/07 : Mobiles # 08 : Tarification speciale l.write(indicatif+(8-len(str(n)))*"0"+str(n)+"\n") n += 1
@+
L'idée de tyrtamos est bien mais:
J'aurais utiliser les indicatif pour le premier for (i1) et range plutôt que xrange pour plus de compatibilité. Il existe des num qui finissent pas 00 (xrange(1, 100))
Si on veux éviter les passages et être un peu efficace, on peut utiliser les itertools:
Code:
1
2
3
4
5
6 from itertools import product # produit cartesien de plusieurs sequences numeros = range(100000000) indicatifs = ['01', '02', '03', '04', '05', '09'] with open("monfichier.txt",'w') as f: for i,n in product(numeros,indicatifs): f.write("%s%0.8i\n"%(i,n))
Bonsoir,
range supporte 100000000 ? De même que for c'est non chez moi:
Cela fait quand même deux passage, la création de la liste avec range et le for.Code:
1
2 >>> numeros = range(100000000) Processus arrêté
@+
en effet, la création de la liste est très gourmande, par contre utiliser xrange au lieu de range permet d'avoir un générateur au lieu d'une liste et cela semble fonctionner (tout en consommant pas mal de mémoire dans mon cas).
Je n'ai pas fait de test de performance, mais j'ai tendance à penser que les itertools bénéficient d'optimisation qu'il n'est pas possible d'obtenir en codant à la main. La complexité reste évidemment la même mais j'imagine qu'on gagne sur les constantes. Cela reste effectivement à vérifier...
Si quelqu'un a le courage de tester....
Bonjour,
En gros vous proposeriez quelque chose comme ceci ?
Ca passe mais la création d'une si large liste continue a me gêner...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 from itertools import product from sys import version def myrange(*args): return list(range(*args)) if version.startswith('3'): xrange = myrange numeros = xrange(100000000).__iter__() indicatifs = ['01', '02', '03', '04', '05', '09'] with open("monfichier.txt",'w') as f: for i, n in product(indicatifs, numeros): f.write("%s%0.8i\n"%(i,n))
@+
Edit: Cela 'passe' au niveau code, pas sur que l'interpréteur accepte un si grand nombre d'itération... A tester.
Re Edit:
Et bien j'ai tester avec le code suivant pour éviter les accès disque
Avec 10000000:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 from itertools import product from sys import version def myrange(*args): return list(range(*args)) if version.startswith('3'): xrange = myrange numeros = xrange(100000000).__iter__() indicatifs = ['01', '02', '03', '04', '05', '09'] for i, n in product(indicatifs, numeros): val = "%s%0.8i\n"%(i,n) print('fin', val)
Avec 100000000:Code:fin 0909999999
@++Code:Processus arrêté
Salut,
Pourquoi ne pas faire un product sur (indicatifs, numeros, numeros, numeros, numeros) avec numeros = [ '%02d' x for x in range(99) ]?
Nous ne garderions dans ce cas que deux peties listes de numéros en mémoire.
- W
Bonsoir
Chez-moi, j'ai testé cette instruction dans Python 2.6.6 sous Windows XP et mon ordi a accepté. Il a été à la ramasse pendant 2/3mn mais ça a tenu (bon maintenant je laggue comme un rat pour changer de fenêtre et mon pagefile.sys est bon pour la poubelle mais ceci n'entre pas en ligne de compte n'est-ce pas ?)
J'ai aussi un SE Fedora Core :ccool:. Quand je booterai dessus, je testerai aussi...
Bonsoir Sve@r,
Je me doute: Pour moi Ubuntu Natty Narwhal @home.
C'est bien ce que je note en fait. La solution n'est pas parfaite (j'avais bien noter : c'est non chez moi ;)).
Comme dit plus haut ce qui me gène vraiment c'est la création d'une si grande liste.
La génération avec while prend bien moins de mémoire. Les boucles de tyrtamos/wiztricks sans doute aussi (c'est le même principe).
@+
Edit: On est tous sur les builtins mais il est possible de construire un étirable qui retourne +1
Bonjour,
Sur l'idée de wiztricks
@+Code:
1
2
3
4
5
6
7
8
9
10
11 from itertools import product numeros = lambda: map(lambda r: "%02d"%r, range(100)) indicatifs = ['01', '02', '03', '04', '05', '09'] with open("monfichier.txt",'w') as f: for i, n1, n2, n3, n4 in product(indicatifs, numeros(), numeros(), numeros(), numeros()): f.write(i+n1+n2+n3+n4+"\n")
l'idée originale quand même...
Code:
1
2
3
4
5
6
7
8
9
10
11 from itertools import product numeros = ['%02d'% x for x in range(100)] indicatifs = ['01', '02', '03', '04', '05', '09'] with open("monfichier.txt",'w') as f: for i, n1, n2, n3, n4 in product(indicatifs, numeros, numeros, numeros, numeros): f.write(i+n1+n2+n3+n4+"\n")
Salut,
Le stockage des valeurs des différents entiers coûtant 400MB ajoutez les overheads de la gestions d'objets et de pointeurs de listes on arrive vite dans les Giga.... de consommation en mémoire virtuelle, merci le 64 bits.
Mais comme "range" fait cela vite, on stresse l'allocation de mémoire physique en poussant dehors les autres activités et en écrivant beaucoup sur le fichier de pagination.
- W
Bonjour wiztricks,
Je me doutais bien que j'avais une 'daube' @home, c'est confirmé :mouarf:
@+
Salut,
daube ou pas... pouvoir demander à l'OS une quantité ressources aussi importante côté espace virtuel et fichier de pagination est une possibilité qui doit se contrôler d'une façon ou d'une autre.
note: imaginez lambda qui se connecte sur votre serveur linux... python -c range(100000000) mets le bestiau à genoux et on se reçoit une rafale d'alarmes sur les consoles de supervision.
Dans le genre "denial of service" :ccool: et il faut se protéger de ces plaisanteries.
- W
Bonjour wiztricks,
C'est en effet d'une protection du système. Je ne me suis, en fait, jamais poser la question (bien qu'ayant déjà vu ce message lors d'installation de deb) car cela n’arrête pas l’interpréteur mais juste le sous-processus.
Comme cela doit être présent sur tout les systèmes (sinon c'est un tord) c'est, je pense, a prendre en compte pour du code 'portable'.
Merci et @+