2012-02-19 21 views
6

Tôi có một chức năng tiết kiệm trong chương trình Python của tôi trông như thế này:Tại sao Python cho tôi "số nguyên là bắt buộc" khi nó không nên?

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) 

Ở đây, n là "1".

tôi nhận được một lỗi như thế này:

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

Sau khi làm việc tải cùng trong vỏ, tôi nhận được không có lỗi:

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

Tại sao điều này có một vấn đề?

+0

Thay đổi 'in (n)' thành 'in (repr (n), gõ (n))'. Đầu ra có thể khai sáng. – zwol

+1

Trong Python 'UpperCase' là dành cho các lớp và' lower_case' là cho các biến. – katrielalex

Trả lời

12

Bạn có thể đã làm một nhập khẩu sao từ các module 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 

vì vậy bạn sử dụng chức năng mở sai. (Tôi cho rằng bạn có thể chỉ đơn giản là thực hiện from os import open, nhưng đó là ít có khả năng.) Nói chung phong cách nhập khẩu này nên tránh, như nên sử dụng global, nơi thực tế.

+0

+1, hoặc có thể chỉ nghĩ rằng 'từ os nhập khẩu mở' là cần thiết –

+0

@gnibbler: Tôi chỉ chỉnh sửa để bình luận về điều đó nhưng bạn đánh tôi với nó. : ^) – DSM

+0

Đó là chính xác những gì nó đã được, cảm ơn. Tôi đã có từ os nhập khẩu * vì một lỗi tôi đã có trước đó, và tôi quên để thoát khỏi nó. -facepalm- Cảm ơn! : D – user1048917

3

Bạn cần phải thoát chuỗi: a \ trong chuỗi là ký tự thoát.

Hoặc thoát khỏi dấu gạch chéo:

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

hoặc sử dụng dây liệu:

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

Đó là một điểm tốt, tôi quên mất những điều đó với những người khác. Mặc dù đó không phải là điều gây ra vấn đề, tôi cũng nên thay đổi điều đó. : P Cảm ơn – user1048917

0

Tôi đặt cược rằng n là 1 không phải "1".

thử:

print(type(n)) 

tôi sẽ đoán rằng bạn sẽ thấy nó một int không phải là một chuỗi.

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

Bạn không thể thêm int và chuỗi sản xuất thông báo lỗi bạn đang nhận được.

+0

Việc thêm một int vào một chuỗi sẽ tạo ra 'TypeError: không thể nối các đối tượng 'str' và 'int' trong Python 2.7, tôi nghĩ vậy. – DSM

+0

Tôi đặt n là "1", "2", "3" hoặc "4", tùy thuộc vào nút được nhấn – user1048917

2

Như DSM đã lưu ý, bạn đang sử dụng http://docs.python.org/library/os.html#os.open thay vì hàm open() tích hợp sẵn.

Trong os.open() tham số thứ hai (chế độ) phải là số nguyên thay vì chuỗi. Vì vậy, nếu bạn nên sử dụng from os import * chuỗi chế độ sau đó chỉ cần thay thế với một trong những args sau:

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

Thực tế, với lần nhập đó, anh ấy sẽ không cần "os". cho các hằng số. – yak

Các vấn đề liên quan