2012-02-19 12 views
6

Ho una funzione di salvataggio nel mio programma Python che assomiglia a questo:Perché Python mi sta dando "un intero è richiesto" quando non dovrebbe essere?

def Save(n): 
    print("S3") 
    global BF 
    global WF 
    global PBList 
    global PWList 
    print(n) 
    File = open("C:\KingsCapture\Saves\\" + n + "\BF.txt", "w") 
    pickle.dump(BF, File) 
    File = open("C:\KingsCapture\Saves\\" + n + "\WF.txt", "w") 
    pickle.dump(WF, File) 
    File = open("C:\KingsCapture\Saves\\" + n + "\PBList.txt", "w") 
    pickle.dump(PBList, File) 
    File = open("C:\KingsCapture\Saves\\" + n + "\PWList.txt", "w") 
    pickle.dump(PWList, File) 

Qui, n è "1".

ottengo un errore simile a questo:

File "C:/Python27/KingsCapture.py", line 519, in Save 
    File = open("C:\KingsCapture\Saves\\" + n + "\BF.txt", "w") 
TypeError: an integer is required 

Sul fare lo stesso carico all'interno della shell, ottengo nessun errore:

>>> File = open("C:\KingsCapture\Test\List.txt", "r") 
>>> File = open("C:\KingsCapture\Test\List.txt", "w") 
>>> n = "1" 
>>> File = open("C:\KingsCapture\Saves\\" + n + "\BF.txt", "r") 
>>> File = open("C:\KingsCapture\Saves\\" + n + "\BF.txt", "w") 

Perché questo avendo un problema?

+0

Cambia 'print (n)' per 'print (repr (n), type (n))'. L'output potrebbe essere illuminante. – zwol

+1

In Python 'UpperCase' è per le classi e' lower_case' è per le variabili. – katrielalex

risposta

12

Probabilmente ha fatto un import stella dal modulo os:

>>> open("test.dat","w") 
<open file 'test.dat', mode 'w' at 0x1004b20c0> 
>>> from os import * 
>>> open("test.dat","w") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: an integer is required 

così sei usando la funzione aperta sbagliata. (Suppongo che avresti potuto semplicemente fare from os import open, ma questo è meno probabile.) In generale questo stile di importazione dovrebbe essere evitato, come dovrebbe usare global, dove pratico.

+0

+1, o forse pensavo che 'da os import open' fosse necessario –

+0

@gnibbler: stavo solo modificando per commentare, ma tu mi hai battuto. : ^) – DSM

+0

Questo è esattamente quello che era, grazie. Ho avuto da OS Import * a causa di un errore che ho avuto in precedenza, e ho dimenticato di sbarazzarsi di esso. -facepalm- Grazie! : D – user1048917

3

È necessario sfuggire alle stringhe: a \ in una stringa è un carattere di escape.

O sfuggire alle barre:

"C:\\KingsCapture\\Test\\List.txt" 

o utilizzare stringhe prime:

r"C:\KingsCapture\Test\List.txt" 
+0

Questo è un buon punto, ho dimenticato quelli con gli altri. Anche se non era quello che stava causando il problema, dovrei cambiare anche questo. : P Grazie – user1048917

0

Scommetto che n è 1 non "1".

prova:

print(type(n)) 

io credo che si vedrà il suo un int non una stringa.

File = open("C:\KingsCapture\Saves\\" + n + "\BF.txt", "w") 

Non è possibile aggiungere intensioni e stringhe che producono il messaggio di errore che si sta ottenendo.

+0

Aggiungere un int a una stringa produrrebbe 'TypeError: impossibile concatenare 'str' e 'int' objects' in Python 2.7, penso. – DSM

+0

Specificamente ho impostato n come "1", "2", "3" o "4", a seconda del pulsante premuto – user1048917

2

Come notato da DSM, si sta utilizzando http://docs.python.org/library/os.html#os.open anziché la funzione open() aperta().

In os.open() il secondo parametro (modalità) deve essere intero anziché stringa. Quindi, se si deve utilizzare from os import * stringa modalità poi basta sostituire con uno dei seguenti argomenti:

  • os.O_RDONLY
  • os.O_WRONLY
  • os.O_RDWR
  • os.O_APPEND
  • os.O_CREAT
  • os.O_EXCL
  • os.O_TRUNC
+3

In realtà, con tale importazione, non avrebbe bisogno di "os". per le costanti. – yak

Problemi correlati