2009-06-25 10 views
28

ho una molto semplice script python che dovrebbe eseguire la scansione di un file di testo, che contiene le linee formattati come id = 'valore' e metterle in un dict. il modulo python si chiama chval.py e il file di input è in.txt. ecco il codice:È richiesto un numero intero? 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() 

quando provo a farlo funzionare io ottenere:

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

sto usando Python 2.4 ... perché sono stato sfidato a non utilizzare nulla più recente, è lì qualcosa su open() che non conosco? Perché vuole un intero?

nulla dopo quella riga non è stata testata. in breve: perché mi sta dando l'errore e come lo risolvo?

+1

Lo script contiene un bug. vals è un dizionario, che non ha un metodo di aggiunta. Vuoi semplicemente assegnare con vals [t [0]] = t [1] – Christopher

+0

anche, dovrebbe essere "per la riga in f:" in contrapposizione a val_f – Sev

+0

sì, sì, avevo passato e cambiato la mia variabile a metà ... Grazie per la segnalazione. – Victor

risposta

52

Perché hai fatto from os import *, stai utilizzando (accidenally) os.open, che in effetti richiede un flag di numero intero invece di una "r" o "w" testuale. Prendi quella linea e supererai quell'errore.

9

Non fare import * from wherever senza una buona ragione (e non ce ne sono molti).

Il codice sta rilevando la funzione os.open() anziché la funzione built-in open(). Se si desidera veramente utilizzare os.open(), fare import os quindi chiamare os.open(....). Qualunque sia l'apertura che desideri chiamare, leggi la documentazione su quali argomenti richiede.

9

Si noti inoltre che a partire da Python 2.6 la funzione built-in open() è ora un alias per la funzione io.open(). Si è anche pensato di rimuovere l'open-in open() in Python 3 e richiedere l'utilizzo di io.open, al fine di evitare collisioni accidentali nello spazio dei nomi derivanti da cose come "da blah import *". In Python 2.6+ è possibile scrivere (e si può anche prendere in considerazione questo stile per una buona pratica):

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

Da http://www.tutorialspoint.com/python/os_open.htm si potrebbe anche mantenere il vostro importazione e l'uso

file = os.open ("foo. txt", modalità)

e la modalità potrebbe essere:

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

fornendo questi parametri risolto il mio problema:

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