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 :

utilisation de la méthode open ,read , write


Sujet :

Python

  1. #1
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut utilisation de la méthode open ,read , write
    Bonjour,

    Si j'ai bien saisi , on utilise comme ceci les méthodes open() , read() et write() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fichier = open(data, 'r') # c'est un fichier .txt
    var = fichier.read()
    fichier.close()
    var.replace('\n')
    fichier = open(data, 'w') #  fichier .txt
    fichier.write(var)
    fichier.close()
    Sauf qu'en moment où je cherche à créer un fichier contenant une liste spéciale , et ensuite l'utiliser dans une fonction permettant d'afficher un dico tabulé , (cette liste spéciale est une exception), je n'arrive pas intégrer l'ensemble totalement ou du moins comprendre le mécanisme.
    J'obtiens un dico tabulé en faisant appel à cette fonction mais je n'arrive pas inclure la détection de la liste LA afin que le dico s'affiche complétement en étant tabuler (bien entendu) .

    D'ailleurs , quel est le role de la méthode enumerate() pour l'ouverture d'un fichier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> def manager(dico) :    # le dico provient d'un fichier .txt .
    ...     for e in sorted(dico) :
    ...             print '\t', e, ':', dico[e]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> LA = ['1', '5', '7', '9', '12', '16']
    >>> var = open('list', 'w')
    >>> var.write('\n'.join(LA))
    >>> var
    <open file 'stop.list', mode 'w' at 0xb745e5f8>
    >>> LA                                                        
    ['1', '5', '7', '9', '12', '16']
    >>> var.close()
    >>> var = open('list', 'r')
    >>> LA = var.read().split()
    >>> LA
    ['1', '5', '7', '9', '12', '16']
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kurodiam Voir le message
    Si j'ai bien saisi , on utilise comme ceci les méthodes open() , read() et write() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fichier = open(data, 'r') # c'est un fichier .txt
    var = fichier.read()
    fichier.close()
    var.replace('\n')
    fichier = open(data, 'w') #  fichier .txt
    fichier.write(var)
    fichier.close()
    Bonjour

    Perso, mes fichiers textes je les traite ligne par ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fp = open(data, 'r') # c'est un fichier .txt
    for ligne in fp:
        ...# traitement de $ligne
    # for()
    fp.close()
    D'autres utilisent with mais je ne m'y suis jamais intéressé...

    Mais bon, pour réécrire le fichier lu vaut peut-être mieux le stocker d'un coup comme tu fais (mais ça dépend de sa taille !!!)

    Citation Envoyé par Kurodiam Voir le message
    Sauf qu'en moment où je cherche à créer un fichier contenant une liste spéciale , et ensuite l'utiliser dans une fonction permettant d'afficher un dico tabulé , (cette liste spéciale est une exception), je n'arrive pas intégrer l'ensemble totalement ou du moins comprendre le mécanisme.
    J'obtiens un dico tabulé en faisant appel à cette fonction mais je n'arrive pas inclure la détection de la liste LA afin que le dico s'affiche complétement en étant tabuler (bien entendu) .
    Là je ne comprends pas bien. Veux-tu stocker une liste Python dans un fcihier texte ? Dans ce cas tu devras créer un mécanisme de conversion te permettant de convertir ta liste en datas texte dans un sens, et de convertir des datas texte en liste dans l'autre sens. Ce qui serait dommage vu qu'il existe un module pickle dédié à ce travail. Il te convertit dans un sens tout objet Python en flux binaire que tu peux ensuite stocker dans un fichier, et te convertit dans l'autre sens un flux binaire (cohérent) en objet Python. Il existe aussi un autre moduke "cPickle" faisant la même chose mais écrit en C. Et si on n'est pas à l'affut des perfos on peut y rajouter le module zlib permettant de compresser/décompresser un flux...
    Code bash : 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
    $ python
    Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import zlib
    >>> import cPickle
    >>> a=range(10)
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> b=cPickle.dumps(a)
    >>> b
    '(lp1\nI0\naI1\naI2\naI3\naI4\naI5\naI6\naI7\naI8\naI9\na.'
    >>> len(b)
    46
    >>> c=zlib.compress(b, 9)
    >>> c
    'x\xda\xd3\xc8)0\xe4\xf24\xe0J\xf44\x04b# 6\x06b\x13 6\x05b3 6\x07b\x0b \xb6\xe4J\xd4\x03\x00\xf9\r\n\x83'
    >>> len(c)
    42
    >>> d=cPickle.loads(zlib.decompress(c))
    >>> d
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> d[5]=500
    >>> d
    [0, 1, 2, 3, 4, 500, 6, 7, 8, 9]
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    Citation Envoyé par Kurodiam Voir le message
    D'ailleurs , quel est le role de la méthode enumerate() pour l'ouverture d'un fichier ?
    Aucun. Cette méthode n'a que pour but d'associer des nombres entiers énumérés (1, 2, 3, ...) à des éléments d'une liste...
    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

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Il ets très important d'utiliser le "with". Pourquoi? Imaginez que votre script/programme plante alors que votre fichier est en cours d'accès. Sans le "with", l'accès se coupe, et votre fichier a alors de grande chance d'être corrompu. Avec le "with", l'accès fichier est d'abord relâché avant de mettre fin au script/programme. De fait, le fichier est toujours viable. Ne jamais négliger ce "with", donc.

    Pour plus d'info, je vous renvoier vers CECI

    Pour la suite, idem que Sve@r: des données & info un peu plus structurées nous permettrons de t'aider au mieux.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

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

    Citation Envoyé par Sve@r Voir le message
    Bonjour

    D'autres utilisent with mais je ne m'y suis jamais intéressé...
    C'est dommage, vous devriez.

    Le mot-clé réservé with permet de faire appel au gestionnaire de contexte d'une fonction / méthode (si celle-ci l'implémente).

    Dans le cas de la fonction open(), le gestionnaire de contexte implémenté dans cette fonction gère lui-même toute la partie try: var=open(...) except: ... => s'il y a le moindre souci, un finally s'occupera de fermer le fichier pour vous en sortie de contexte.

    Donc beaucoup moins de code à gérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    with open("toto.txt") as fichier:
        for ligne in fichier:
            print(ligne.strip())
        # end for
    # end with - le fichier sera fermé quoiqu'il advienne
    @+.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Il ets très important d'utiliser le "with". Pourquoi? Imaginez que votre script/programme plante alors que votre fichier est en cours d'accès. Sans le "with", l'accès se coupe, et votre fichier a alors de grande chance d'être corrompu. Avec le "with", l'accès fichier est d'abord relâché avant de mettre fin au script/programme. De fait, le fichier est toujours viable. Ne jamais négliger ce "with", donc.
    Citation Envoyé par tarball69 Voir le message
    C'est dommage, vous devriez.
    Oui c'est vrai. Mais il y a tellement de choses à voir en Python...
    Mais bon, ce matin, après avoir lu vos deux messages, je m'y suis mis et effectivement j'aime bien. Surtout cette histoire de "context manager" que l'on peut implémenter soi-même si on désire faire un truc un peu béton.

    Merci à vous deux
    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]

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    (Je passe par là par hasard ^^)

    J'avais déjà vu cette instruction et je ne m'y étais jamais intéressé non plus. Je vais également m'y mettre, merci

    EDIT : la documentation sur cette instruction https://docs.python.org/2/reference/...with-statement

  7. #7
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Merci pour les explications

    En fait , mes questionnements résident dans le fait que j'essaye de détecter quelle serait la fonction qui dédouble l'affichage de mon dico vers la fin , donc c'est important de connaitre l'utilisation de ces méthodes .Donc si j'ai bien saisi ma méthode est certes la plus sure mais aussi la plus longue

    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
     
    >>> def manager(dico) :    # le dico provient d'un fichier .txt .
    ...     for e in sorted(dico) :
    ...             print '\t', e, ':', dico[e]
     
    >>> LA = ['1', '5', '7', '8', '9']
    >>> var = open('list', 'w')
    >>> var.write('\n'.join(LA))   # liste spéciale crée précédemment 
    >>> var
    <open file 'LA', mode 'w' at 0xb745e5f8>
    >>> LA
    ['1', '5', '7', '8', '9']
    >>> var.close()
    >>> var = open('list', 'r')
    >>> LA = var.read().split()        # là en principe , je mets close() juste aprés comme l'a dit @sver .
    >>> LA
    ['1', '5', '7', '8', '9']
    >>> LA = var.read().split('\n')        # bon , je voulais juste tester mais çà n'a aucun sens .
    >>> LA
    ['']
    >>> LA = '1 5 7 8 9'.split()
    >>> def ensemble(fichier, dico) :
    ...     var = open(fichier, 'r')                      # c'est le fichier .txt contenant tous les chiffres .
    ...     for n, ligne in enumerate(var) :
    ...             dico = dico , ligne.split(), n + 1                        
    ...     var.close()
    ...     manager(dico)
    ...     return dico                             # là , çà retourne bien un seul dico ....
    >>> pilote('fichier', {})                     # là , ce fichier est carrément un texte .
    	3 : [7]
    	4 : [3]
    	6 : [4]
    	10 : [7]
    	11 : [1]
    	12 : [8]
    {'3': [5], '11': [1], '6': [4], '12': [8], '1,': [1], '7': [9],........}              # déjà on voit ce double affichage du dico , qui est en plus non ordonné 
    >>>

    Edit : je pense avoir trouvé , il faut dans la fonction ensemble() : retourner juste manager(dico) pour ne pas obtenir un affichage en double .
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  8. #8
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Si tu as trouvé, n'oublie pas de passer le post à . Très important pour les suivants. Merci pour eux.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boost::iostreams::zlib & méthodes read/write
    Par Blustuff dans le forum Boost
    Réponses: 0
    Dernier message: 13/08/2011, 13h05
  2. copie de fichier en utilisant open,read,write
    Par une_tite_question dans le forum POSIX
    Réponses: 3
    Dernier message: 08/09/2008, 14h55
  3. [AJAX] Permission refusée d'utiliser la méthode open
    Par DaSoul dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/11/2006, 06h34
  4. [Select()/Focus()] Pb dans l'utilisation de ces méthodes
    Par Kylen dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/06/2005, 14h54
  5. Problème de read/write
    Par mylooz dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 25/03/2005, 19h15

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