2009-06-25 11 views
28

Tengo un script en Python muy simple que debería escanear un archivo de texto, que contiene líneas con formato de ID = 'valor ' y ponerlos en un diccionario. el módulo python se llama chval.py y el archivo de entrada es in.txt. Aquí está el código:¿Se requiere un número entero? open()

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() 

cuando intento ejecutarlo me sale:

Traceback (most recent call last):
File "chval.py", line 9, in ? f = open(sys.argv[1], 'r') TypeError: an integer is required

estoy usando Python 2.4 ... porque he sido desafiado a no usar nada nuevo, ¿hay algo sobre open() que no conozco? ¿Por qué quiere un número entero?

nada después de esa línea no se ha probado. en resumen: ¿por qué me está dando el error y cómo lo soluciono?

+1

Su guión tiene un error en ella. vals es un diccionario, que no tiene un método de agregar. Desea simplemente asignar con vals [t [0]] = t [1] – Christopher

+0

también, se supone que es "para la línea en f:" en oposición a val_f – Sev

+0

sí, he pasado, y he cambiado mi variable a la mitad ... gracias por señalar eso. – Victor

Respuesta

52

Debido a que hizo from os import *, que está (accidenally) usando os.open, que de hecho requiere una bandera de número entero en lugar de un textual "r" o "w". Saca esa línea y superarás ese error.

9

No haga import * from wherever sin una buena razón (y no hay muchos).

Su código es recoger la os.open función en lugar de() la función incorporada open(). Si realmente quiere usar os.open(), haga import os y luego llame al os.open(....). Cualquiera que sea la apertura que desee llamar, lea la documentación sobre los argumentos que requiere.

9

También hay que resaltar que a partir de Python 2.6 la función incorporada open() es ahora un alias para la función io.open(). Incluso se consideró eliminar el built-in open() en Python 3 y requerir el uso de io.open, para evitar colisiones accidentales del espacio de nombres como resultado de "from blah import *". En Python 2.6+ puede escribir (y también se puede considerar este estilo para una buena práctica):

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

De http://www.tutorialspoint.com/python/os_open.htm también se podría mantener su importación y uso

file = os.open ("foo. txt", modo)

y el modo podrían ser:

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 
1

al proporcionar estos parámetros resuelto mi problema:

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