Partage
  • Partager sur Facebook
  • Partager sur Twitter

Générer un fichier

Sujet résolu
    2 février 2011 à 11:31:59

    Bonjour tout le monde ,

    je débute en python et je suis confronté à un "petit" problème.
    j'essaie de générer un fichier en python qui contient des nombres.
    le cas suivant fonctionne très bien:

    fichier = open("fichier.txt", "w")
    
    fichier.write('\n'.join(['%4d'%a for a in range(10000)]))
    
    fichier.close()
    


    Mais dès que je veux générer un fichier plus volumineux,
    je suis planté, sans doute je n'utilise pas les bonnes fonctions ^_^
    le fichier que je veux générer est le suivant:

    fichier = open("fichier.txt", "w")
    
    fichier.write('\n'.join(['%10d'%a for a in range(10000000)]))
    
    fichier.close()
    


    D'avance merci pour votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2011 à 12:03:04

      Ce code fonctionne parfaitement chez moi. C'est juste que la génération de nombres que tu fais, demande environ 5-8 secondes de calcu, ce qui va faire planter ton IDLE (ou l'IDE que t'utilises), il faut juste attendre la fin de la méthode write() et c'est bon.
      • Partager sur Facebook
      • Partager sur Twitter
        2 février 2011 à 12:20:38

        Pardon je me suis trompé ,
        en fait c'est des que je passe à
        range(100000000)
        

        ou plus, 100 millions ou plus,
        j'obtiens:
        Traceback (most recent call last):
          File "gen2.py", line 3, in <module>
            fichier.write('\n'.join(['%10d'%a for a in range(100000000)]))
        MemoryError


        Merci pour votre aide :)
        • Partager sur Facebook
        • Partager sur Twitter
          2 février 2011 à 14:25:24

          Salut, :)

          8 secondes de recherche dans google:

          MemoryError
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            2 février 2011 à 14:34:38

            Les listes sont très limitées. Donc, tu ne peux pas utiliser les listes compréhensions avec un nombre si grand.

            Essaie ça :

            with open(filename, 'w') as file:
                for x in range(100000000):
                    file.write(str(x) + '\n')
            


            PS: Je ne suis pas sûr, mais je crois qu'avec python 2, range renvoie aussi une liste. Si c'est le cas, il vaudrait mieux utiliser une boucle while (à confirmer...).
            • Partager sur Facebook
            • Partager sur Twitter
              2 février 2011 à 14:54:40

              Merci pour vos réponses,
              ça fonctionne :)

              ++
              • Partager sur Facebook
              • Partager sur Twitter
                2 février 2011 à 15:19:43

                Tu es sous Python 2.x je suppose ? Si c'est le cas, remplace range() par xrange().

                Petit conseil : tu peux utiliser les instuctions with et as si tu travail sur un fichier :

                with open('foo.txt', 'w') as fichier:
                    # Travail sur la variable "fichier" laquelle fait référence au fichier foo.txt
                


                Si tu veux en savoir plus, je te renvois au tutoriel de delroth et natim

                EDIT : Grilled par LeYan'tibus :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  2 février 2011 à 18:48:40

                  Citation : LeYan'tibus

                  PS: Je ne suis pas sûr, mais je crois qu'avec python 2, range renvoie aussi une liste. Si c'est le cas, il vaudrait mieux utiliser une boucle while (à confirmer...).



                  En Python 2 xrange est l'équivalent du range de Python 3 (même si cette fonction n'existait pas, il serait encore plus propre de la coder (ce qui se fait très simplement) que d'utiliser une boucle while).
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                  Anonyme
                    2 février 2011 à 20:45:20

                    Ah oui, j'avais oublié le xrange()... :-°

                    Sinon, pour coder une fonction similaire (donc un générator, je pense) il faudra bien utiliser une boucle while ou il y a plus simple ?

                    J'avais pensé à un truc dans ce genre (avec Python 3 ;) ) :
                    def xrange(start, stop=0, step=1):
                    	if not stop:
                    		stop = start
                    		start = 0
                    	if (step < 0 and start < stop) \
                    	or (step > 0 and start > stop) \
                    	or not step: pass
                    	else :
                    		while start != stop:
                    			yield start
                    			start += step
                    


                    Quelqu'un voie plus simple ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 février 2011 à 21:43:15

                      def xrange(start, stop=None, step=1):
                          if stop is None:
                              start, stop = 0, start
                          while step > 0 and start < stop or step < 0 and start > stop:
                              yield start
                              start += step
                      


                      Code tiré du cours "Pratiques avancées et méconnues en Python". Il est similaire à celui de LeYan'tibus :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 février 2011 à 7:37:57

                        Citation : LeYan'tibus


                        Sinon, pour coder une fonction similaire (donc un générator, je pense) il faudra bien utiliser une boucle while ou il y a plus simple ?



                        Effectivement, il faut utiliser un while en interne, mais ça permet de préserver la sémantique (itérer sur une séquence d'éléments bien définie : toujours avec un for).
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                        Anonyme
                          4 février 2011 à 13:53:42

                          def xrange(start, stop=0, step=1):
                          	if not stop:
                          		start, stop = 0, start
                          	if step > 0 and start < stop or step < 0 and start > stop:
                          		while start != stop:
                          			yield start
                          			start += step
                          

                          C'est le plus optimal. ;)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Générer un fichier

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown