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 :

[os.open] Écriture séquentielle dans un fichier TypeError: an integer is required (got type str)


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut [os.open] Écriture séquentielle dans un fichier TypeError: an integer is required (got type str)
    Bonjour,

    Je suis le tuto http://python.developpez.com/cours/T...age=page_11#L9 et lorsque j'essaye de faire la même chose j'obtient des TypeError.


    Python version 3.4.2
    Windows 7

    Test 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os
    os.chdir("C:\programme")
    obFichier = os.open("test.txt",777,"w")
    obFichier.write('Bonjour, fichier !')
    obFichier.close()
    Traceback (most recent call last):
    File "C:\Users\user\Desktop\programmation\fichier.py", line 3, in <module>
    obFichier = os.open("test.txt",777,"w")
    TypeError: an integer is required (got type str)


    Test 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from os import *
    chdir("C:\programme")
    obFichier = open("test.txt",777,"w")
    obFichier.write('Bonjour, fichier !')
    obFichier.close()
    Traceback (most recent call last):
    File "C:\Users\user\Desktop\programmation\fichier.py", line 3, in <module>
    obFichier = open("test.txt",777,"w")
    TypeError: an integer is required (got type str)

    Test 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os
    os.chdir("C:\programme")
    obFichier = os.open("test.txt",777)
    obFichier.write('Bonjour, fichier !')
    obFichier.close()
    Traceback (most recent call last):
    File "C:\Users\user\Desktop\programmation\fichier.py", line 4, in <module>
    obFichier.write('Bonjour, fichier !')
    AttributeError: 'int' object has no attribute 'write'

    Test 4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os
    os.chdir("C:\programme")
    obFichier = os.open('test.txt', 'w')
    obFichier.write('Bonjour, fichier !')
    obFichier.close()
    Traceback (most recent call last):
    File "C:\Users\user\Desktop\programmation\fichier.py", line 3, in <module>
    obFichier = os.open('test.txt', 'w')
    TypeError: an integer is required (got type str)


    Par avance merci pour votre aide

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    Et en lisant la doc pour l'ordre des paramètres et les paramètres eux-mêmes ... ?

    Tu mélanges joyeusement open et os.open.

    Et, par la suite aussi : os.open renvoie un entier ! Donc obFichier.write couinera une fois le os.open corrigé (obFichier est un entier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import os
    >>> fd = os.open('toto',os.O_CREAT | os.O_WRONLY, 0777)
    >>> ecrits = os.write(fd, "qqch")
    >>> ecrits
    4
    >>> os.close(fd)
    >>> _ = os.system('more toto')
    qqch
    >>>
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut erreur str
    Merci pour votre réponse. Malheureusement j'ai toujours une erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import os
    fd = os.open('toto',os.O_CREAT | os.O_WRONLY, 777)
    ecrits = os.write(fd, "qqch")
    os.close(fd)
    Traceback (most recent call last):
    File "C:\Users\user\Desktop\programmation\test.py", line 3, in <module>
    ecrits = os.write(fd, "qqch")
    TypeError: 'str' does not support the buffer interface

    Lorsque je spécifie que fd et un str même erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os
    fd = os.open('toto',os.O_CREAT | os.O_WRONLY, 777)
    fd = str(fd)
    ecrits = os.write(fd, "qqch")
    os.close(fd)
    Traceback (most recent call last):
    File "C:\Users\user\Desktop\programmation\test.py", line 4, in <module>
    ecrits = os.write(fd, "qqch")
    TypeError: an integer is required (got type str)

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si tu n'as pas une bonne raison d'utiliser "os.open", utilise "open": c'est beaucoup plus simple.

    En l’occurrence, dans ton code:

    - os.write demande un bytestring (1 caractère = 1 octet) sous Python 3. Et retournera le nombre d'octets réellement écrits.

    - Le 777 devrait être en octal (0o777) et non en décimal. Il se traduit en binaire par: bin(0o777) => '0b111111111' et cette position des bits est bien celle recherchée par ce mode sur Unix. Avec 777 en décimal, ça donne n'importe quoi: bin(777) => '0b1100001001'.

    - le résultat d'un os.open n'est pas à convertir en str (d'où l'erreur).

    Tu gagnerais un temps fou à te reporter à la doc, au moins en cas d'erreur. Mais à défaut, on te répondra quand même... ;-)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Merci
    Merci pour votre réponse.

    Je ne comprend pas la différence entre open et os.open et je n'ai pas non plus compris pourquoi write attend un argument pour définir les droits de lecture écriture en 777 etc.

    Toute fois j'ai trouvé une réponse en continuant à chercher. Heureusement que developpez.net et ses membres existes pour aider les newbes :-D Merci encore à vous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os
    os.chdir("C:/prog")
    mon_fichier = open("test.txt", "w")
    mon_fichier.write("Premier test d'écriture dans un fichier via Python")
    mon_fichier.close()
    Maintenance me reste à voir comment stocker des valeurs int, float dans des fichiers :-D

  6. #6
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par asmodaisda Voir le message
    ... et je n'ai pas non plus compris pourquoi write attend un argument pour définir les droits de lecture écriture en 777 etc
    Les droits sont un paramètre facultatif de os.open. Sous un Unix-like, c'est la valeur de ton umask qui déterminera les droits, la valeur par défaut du paramètre mode étant 0777 (voir la doc). Sous Windows, ?

    Citation Envoyé par asmodaisda Voir le message
    Je ne comprend pas la différence entre open et os.open
    Ce sont deux fonctions qui permettent d'ouvrir des fichiers mais ce sont deux fonctions différentes. open est une fonction "haut niveau" alors que os.open est plus "bas niveau", plus proche de l'OS.

    Si tu connais le C et Unix :
    • open est à rapprocher de la fonction fopen de la bibliothèque standard C
    • os.open est à rapprocher de l'appel système open


    D'ailleurs si tu consultes les pages du manuel (j'ai mis les liens), tu vas retrouver peu ou prou les mêmes paramètres.

    Quand je dis que open est plus "haut niveau" que os.open, ça ne va pas très loin mais, par exemple, open (fopen en C) gère un buffer (en lecture et en écriture) alors que os.open (appel système Unix open), non.

    Je le prouve :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> import os
    >>> os.path.exists('toto')
    False
    >>> f=open('toto','w')
    >>> _ = os.system('ls -l toto')
    -rw-r--r--  1 plxpy  staff  0 13 fév 19:36 toto
    >>> f.write('qqch')
    >>> _ = os.system('ls -l toto')
    -rw-r--r--  1 plxpy  staff  0 13 fév 19:36 toto
    >>> f.flush()     # je force l'écriture sur disque
    >>> _ = os.system('ls -l toto')
    -rw-r--r--  1 plxpy  staff  4 13 fév 19:36 toto
    >>> f.close()
    alors que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> fd = os.open('toto', os.O_CREAT | os.O_WRONLY)
    >>> _ = os.system('ls -l toto')
    -rwxr-xr-x  1 plxpy  staff  0 13 fév 19:38 toto
    >>> os.write(fd, 'qqch')
    4
    >>> _ = os.system('ls -l toto')     # je N'ai PAS forcé l'écriture sur disque
    -rwxr-xr-x  1 plxpy  staff  4 13 fév 19:39 toto
    >>> os.close(fd)
    Sous Windows, je ne connais pas trop mais je pense que c'est du même tonneau.

    Mais, comme l'a indiqué précédemment Tyrtamos, si tu n'as pas de besoin particulier, il faut utiliser open et non os.open en Python
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut merci
    Merci pour les infos

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

Discussions similaires

  1. Problème d'écriture String dans un fichier
    Par scary dans le forum Langage
    Réponses: 1
    Dernier message: 03/07/2009, 20h14
  2. écritures concurrentes dans un fichier
    Par qouify dans le forum C
    Réponses: 34
    Dernier message: 01/08/2007, 15h41
  3. [POI] Problème écriture/lecture dans un fichier Excel
    Par steuve dans le forum Documents
    Réponses: 6
    Dernier message: 02/07/2007, 15h47
  4. écriture/lecture dans des fichiers
    Par rafale001 dans le forum C
    Réponses: 14
    Dernier message: 02/03/2007, 16h59
  5. écritures concurrentes dans un fichier
    Par djmalo dans le forum C
    Réponses: 9
    Dernier message: 06/03/2005, 01h45

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