web-dev-qa-db-fra.com

Un entier est requis? ouvrir()

J'ai un script python très simple qui devrait balayer un fichier texte, qui contient des lignes au format id = 'value' et les mettre dans un dict. le module python s'appelle chval.py et le fichier d'entrée est in.txt. voici le code:

import os,sys
from os import *
from sys import *

vals = {}

f = open(sys.argv[1], 'r')

for line in val_f:
    t = line.split('=')
    t[1].strip('\'')
    vals.append(t[0], t[1])

print vals

f.close()

quand j'essaye de le lancer, je reçois:

Traceback (appel le plus récent en dernier):
Fichier "chval.py", ligne 9, dans? f = open (sys.argv [1], 'r') TypeError: un entier est requis

J'utilise python 2.4 ... parce que j'ai été mis au défi de ne rien utiliser de plus récent, y a-t-il quelque chose à propos de open () que je ne connais pas? Pourquoi veut-il un entier?

quoi que ce soit après cette ligne n'est pas testé. en bref: pourquoi me donne-t-il l'erreur et comment puis-je le réparer?

35
Victor

Parce que vous avez utilisé from os import *, vous utilisez (par inadvertance) os.open, qui nécessite en effet un indicateur entier au lieu d'un "r" ou "w" textuel. Sortez cette ligne et vous aurez passé cette erreur.

59
Mark Rushakoff

Ne faites pas import * from wherever sans une bonne raison (et ils ne sont pas nombreux).

Votre code récupère la fonction os.open () à la place de la fonction open () intégrée. Si vous voulez vraiment utiliser os.open (), faites import os puis appelez os.open(....). Quel que soit le poste que vous souhaitez appeler, lisez la documentation sur les arguments nécessaires. 

11
John Machin

Il convient également de noter que depuis Python 2.6, la fonction intégrée open () est désormais un alias de la fonction io.open (). Il a même été envisagé de supprimer la méthode open () intégrée à Python 3 et de nécessiter l'utilisation de io.open, afin d'éviter les collisions accidentelles dans les espaces de noms résultant d'éléments tels que "from blah import *". En Python 2.6+, vous pouvez écrire (et vous pouvez également considérer ce style comme une bonne pratique):

import io
filehandle = io.open(sys.argv[1], 'r')
10
Wheat

Fournir ces paramètres a résolu mon problème:

with open('tomorrow.txt', mode='w', encoding='UTF-8', errors='strict', buffering=1) as file:
    file.write(result)
1
Hamid

De http://www.tutorialspoint.com/python/os_open.htm vous pouvez également conserver votre importation et votre utilisation 

fichier = os.open ("foo.txt", mode)

et le mode pourrait être:

os.O_RDONLY: open for reading only
os.O_WRONLY: open for writing only
os.O_RDWR : open for reading and writing
os.O_NONBLOCK: do not block on open
os.O_APPEND: append on each write
os.O_CREAT: create file if it does not exist
os.O_TRUNC: truncate size to 0
os.O_EXCL: error if create and file exists
os.O_SHLOCK: atomically obtain a shared lock
os.O_EXLOCK: atomically obtain an exclusive lock
os.O_DIRECT: eliminate or reduce cache effects
os.O_FSYNC : synchronous writes
os.O_NOFOLLOW: do not follow symlinks
0
Omar Jaafor