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 :

Remplir un fichier txt au fur et à mesure qu'il est généré


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 2
    Par défaut Remplir un fichier txt au fur et à mesure qu'il est généré
    Bonjour

    Je suis très nouveau avec Python alors désolé si ma question est triviale.
    Mais voila mon défi :

    Le programme ci-joint génère la liste des combinaisons possibles de k éléments parmi n.
    Mon problème est que cette liste peut être très longue, alors serait-il possible de générer un fichier texte qui se remplirait au fur et à mesure avec les combinaisons trouvées.

    1000 merci d’avance.

    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
         # Program to print all combination  
         # of size r in an array of size n 
     
         # The main function that prints  
         # all combinations of size r in  
         # arr[] of size n. This function  
         # mainly uses combinationUtil() 
         def printCombination(arr, n, r): 
     
             # A temporary array to  
             # store all combination 
             # one by one 
             data = [0]*r; 
     
             # Print all combination  
             # using temprary array 'data[]' 
             combinationUtil(arr, data, 0,  
                             n - 1, 0, r); 
     
         # arr[] ---> Input Array 
         # data[] ---> Temporary array to 
         #         store current combination 
         # start & end ---> Staring and Ending 
         #             indexes in arr[] 
         # index ---> Current index in data[] 
         # r ---> Size of a combination  
         # to be printed  
         def combinationUtil(arr, data, start,  
                             end, index, r): 
     
             # Current combination is ready  
             # to be printed, print it 
             if (index == r): 
                 for j in range(r): 
                     print(data[j], end = " "); 
                 print(); 
                 return; 
     
             # replace index with all 
             # possible elements. The 
             # condition "end-i+1 >=  
             # r-index" makes sure that  
             # including one element at 
             # index will make a combination  
             # with remaining elements at  
             # remaining positions 
             i = start;  
             while(i <= end and end - i + 1 >= r - index): 
                 data[index] = arr[i]; 
                 combinationUtil(arr, data, i + 1,  
                                 end, index + 1, r); 
                 i += 1; 
     
         # Driver Code 
         arr = [1, 2, 3, 4, 5]; 
         r = 3; 
         n = len(arr); 
         printCombination(arr, n, r);

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    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 859
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Déjà pour un débutant ton programme est pas mal. Tu maitrises bien la récursivité.

    En fait c'est le titre de ta question qui est un peu trivial dans le sens ou "remplir un fichier pendant qu'il est généré" est un pléonasme. Car le remplissage d'un fichier "est" sa génération. Ben oui, tant qu'on ne le remplit pas, il n'est pas généré.

    En revanche, la question elle-même est plus naturelle. En fait, je la comprends comme "la liste des combinaisons est tellement grande que je voudrais l'écrire dans un fichier au fur et à mesure pour ne pas avoir de souci de RAM" et ça c'est une question tout à fait légitime.
    La solution est dans le yield qui permet de créer des générateurs. C'est une instruction qu'on trouve dans peu de langages (je l'ai vu en C#, en Python et en php).

    Prenons l'exemple d'une fonction qui retourne la liste des 5 premiers entiers: def fct(): return (1, 2, 3, 4, 5). Quand tu l'appelles, elle te renvoie (1, 2, 3, 4, 5) c'est à dire un tableau RAM de 5 éléments.
    Imaginons toutefois que tu t'en serves de cette façon: for x in fct(): print(x), c'est à dire que tu traites les nombres un à un de façon individuelle, tu as alors gavé ta ram de 5 nombres pour rien car un seul est utilisé. Ce serait bien mieux si on obtenait de la fonction un seul nombre pourvu que ce soit le nombre attendu au moment où on l'appelle.

    Cette action est possible en Python en utilisant yield. Pour simplifier, un yield se comporte comme un return sauf que l'état de la fonction est en quelque sorte sauvegardé et si on la rappelle, le code reprend à cet état.

    Ainsi la fonction devient (*)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def fct():
    	yield 1
    	yield 2
    	yield 3
    	yield 4
    	yield 5

    Son utilisation reste la même: for x in fct(): print(x). La boucle itèrera dessus tant qu'elle a des trucs à renvoyer, sauf que ces trucs seront renvoyés un à un et non d'un coup.

    Donc toi, déjà il faudrait que tu changes ta fonction pour qu'elle retourne les combinaisons au lieu de les afficher (ça c'était une erreur car tu as lié la fonction à une utilisation particulière ce qui casse son indépendance vis à vis de l'appelant et t'empêche maintenant de l'utiliser dans un autre contexte).
    Et ensuite, au lieu de retourner toutes les combinaisons d'un coup, tu les retournes une à une via un yield.
    Et du côté appelant, te suffit de faire un fp=open("fichier_a_ecrire", "w"); for c in fonction(...): print(c, file=fp); fp.close().

    (*) bien entendu, on peut aussi faire une boucle dans la fonction def fct(): for x in range(1, 6): yield x mais je l'ai écrite ainsi pour bien montrer que quand elle est appelée 2 fois, le code reprend alors sous le premier yield. D'ailleurs tu peux rajouter un print("ok") au milieu pour voir quand il apparait
    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]

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

    Citation Envoyé par Augus Mathus Voir le message
    alors serait-il possible de générer un fichier texte qui se remplirait au fur et à mesure avec les combinaisons trouvées.
    Pas besoin de modifier le code pour çà: vous redirigez la sortie vers un fichier via le "shell" i.e. python monprog.py >fichier.txt

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

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    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 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    vous redirigez la sortie vers un fichier via le "shell" i.e. python monprog.py >fichier.txt
    Oui aussi. Mais comme on est dans le forum Python, je lui proposais une solution "pure Python" c.a.d. qui ne fait pas appel à une syntaxe liée à l'OS...
    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]

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 787
    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 787
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je lui proposais une solution "pure Python" c.a.d. qui ne fait pas appel à une syntaxe liée à l'OS...
    La solution Python s'appelle combinations...
    Et c'est pas parce qu'on programme qu'on doit oublier qu'il y a un "shell" qui sait aussi faire des choses... permettant d'éviter de programmer.

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

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Si j'ai bien compris quand on écrit dans un fichier au fur et à mesure on écrit directement dans le disque dur et non dans la RAM ?

    On n'utilise pas de buffer/tampon comme dans certains langages ?

    Je crois qu'un des intérêts des tampons c'est que cela permet d'aller plus vite et ça préserve peut-être le disque dur ? Mais peut-être qu'aujourd'hui il n'y a pas beaucoup de différence vu que les disques durs sont plus performants surtout qu'il y a maintenant les disques ssd...

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    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 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Si j'ai bien compris quand on écrit dans un fichier au fur et à mesure on écrit directement dans le disque dur et non dans la RAM ?
    Exact

    Citation Envoyé par Beginner. Voir le message
    On n'utilise pas de buffer/tampon comme dans certains langages
    Si bien sûr. En programmation on "admet" ou on "considère" qu'une instruction d'écriture (ex fp.write(...)) écrira sur le fichier au moment où elle est exécutée et on programme son algo généralement en partant de ce principe ; mais concrètement, il y a effectivement bufferisation. Cette bufferisation se fait déjà au niveau du langage. Les fonctions d'écriture stockent en fait les datas dans un tampon RAM qui ne sera réellement envoyé au driver disque que dans certains cas (quand le tampon est plein, quand on ferme le fichier ou quand on le demande explicitement via fp.flush()). Certains langages permettent aussi de paramétrer ce tampon (dans Python ça se fait via le paramètre "buffering" de open()).
    Et en plus, le disque physique possède lui-aussi son propre tampon géré là par sa carte système.
    Mais quand on programme, sauf certains cas très particuliers, on ne se préoccupe pas du buffer car on n'a pas vraiment besoin de gérer le moment exact où l'écriture se fait. On sait que quand le programme sera terminé le fichier sera écrit et ça suffit.

    Citation Envoyé par Beginner. Voir le message
    Je crois qu'un des intérêts des tampons c'est que cela permet d'aller plus vite et ça préserve peut-être le disque dur ? Mais peut-être qu'aujourd'hui il n'y a pas beaucoup de différence vu que les disques durs sont plus performants surtout qu'il y a maintenant les disques ssd...
    En fait c'est pour optimiser les accès. Si tu demandes 100 octets, l'OS va en charger xxxx (un nombre que je ne connais pas mais assez gros) dans le tampon (c'est aussi lent pour la tête de lecture d'en lire 100 que d'en lire xxxx) puis t'en donnera 100. Si plus tard tu en redemandes 100 autres, ils te seront donnés depuis le tampon mémoire et là ce sera super rapide.
    Car les dd ont beau être performants, c'est toujours 1000 fois plus long que de lire depuis un dd que depuis la RAM. Et je ne pense pas que les SSD vont faire évoluer cette techno (ils ont des avantages certes mais aussi des inconvénients surtout liés aux limitations de cycles de lecture/écriture).
    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]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 787
    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 787
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Si j'ai bien compris quand on écrit dans un fichier au fur et à mesure on écrit directement dans le disque dur et non dans la RAM ?
    un write va éventuellement coder la séquence de caractères Unicode en bytes et demander au système d'exploitation de l'écrire sur le disque.... Et toute une machinerie va s'appliquer à utiliser la bande passante "au mieux" sachant qu'on ne sait lire/écrire un disque que par blocs de 512 ou 4096 octets et qu'il sera plus performant d'écrire une séquence de blocs "à la suite" plutôt qu'un après l'autre.

    Je crois qu'un des intérêts des tampons c'est que cela permet d'aller plus vite et ça préserve peut-être le disque dur ? Mais peut-être qu'aujourd'hui il n'y a pas beaucoup de différence vu que les disques durs sont plus performants surtout qu'il y a maintenant les disques ssd...
    Avec un disque "mécanique" on va essayer de réduire le déplacement des têtes pour effectuer des transferts à la vitesse de rotation.
    Avec un disque SSD, il n'y a plus de "mécanique" mais çà reste un tas de blocs avec une bande passante limitée (mais bien meilleure) côté IO par secondes.

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

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ah c'est intéressant, merci à vous deux pour vos réponses...

Discussions similaires

  1. [XL-2016] Remplir des cellules automatiquement (au fur et à mesure)
    Par Cyberium dans le forum Excel
    Réponses: 7
    Dernier message: 21/03/2018, 19h57
  2. Crée un fichier wav au fur et à mesure
    Par Badshade23 dans le forum Multimédia
    Réponses: 16
    Dernier message: 09/07/2015, 10h38
  3. remplir un fichier .txt en sortie
    Par Nikolai dans le forum C++
    Réponses: 2
    Dernier message: 01/09/2009, 12h28
  4. Remplir un fichier txt à l'aide d'un tableau
    Par beegees dans le forum Cobol
    Réponses: 17
    Dernier message: 30/08/2008, 09h33
  5. Réponses: 5
    Dernier message: 20/06/2007, 12h22

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