2012-02-19 21 views
6

que tienen una función de guardado dentro de mi programa en Python que se parece a esto:¿Por qué Python me da "se requiere un número entero" cuando no debería ser?

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) 

Aquí, n es "1".

consigo un error con este aspecto:

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

Al hacer la misma carga dentro de la cáscara, me sale ningún error:

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

¿Por qué esta teniendo un problema?

+0

Cambie 'print (n)' a 'print (repr (n), type (n))'. La salida puede ser esclarecedora. – zwol

+1

En Python 'UpperCase' es para clases y' low_case' es para variables. – katrielalex

Respuesta

12

Probablemente hizo una importación de estrellas del módulo 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 

por lo que está usando la función abierta incorrecta. (Supongo que simplemente podría haber hecho from os import open, pero eso es menos probable.) En general, este estilo de importación debe evitarse, al igual que el uso de global, donde sea práctico.

+0

+1, o posiblemente solo pensé que 'from os import open' era necesario –

+0

@gnibbler: Yo solo estaba editando para comentar sobre eso pero me ganaste. : ^) – DSM

+0

Eso es exactamente lo que era, gracias. Tuve de OS import * debido a un error que tuve antes, y me olvidé de deshacerme de él. -facepalm- ¡Gracias! : D – user1048917

3

Necesita escapar de sus cadenas: una \ en una cadena es un carácter de escape.

Cualquiera de escapar de las barras:

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

o utilizar cadenas primas:

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

Ese es un buen punto, me olvidé de aquellos con los demás. Aunque eso no era lo que causaba el problema, debería cambiar eso también. : P Gracias – user1048917

0

Apuesto a que n es 1 no "1".

intento:

print(type(n)) 

voy a supongo que verá su un int no es una cadena.

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

No puede agregar enteros y cadenas produciendo el mensaje de error que está recibiendo.

+0

Agregar un int a una cadena produciría 'TypeError: no se puede concatenar 'str' y 'int' objects' en Python 2.7, creo. – DSM

+0

Específicamente configuré n para ser "1", "2", "3" o "4", dependiendo del botón que se presiona – user1048917

2

Como señaló DSM, está utilizando http://docs.python.org/library/os.html#os.open en lugar de la función integrada de abrir().

En os.open(), el segundo parámetro (modo) debe ser entero en lugar de cadena. Por lo tanto, si se debe utilizar el modo de from os import * cadena a continuación, sólo sustitutivo con uno de los siguientes argumentos:

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

En realidad, con esa importación, no necesitaría "OS". para las constantes. – yak

Cuestiones relacionadas