2009-03-17 30 views
12

Trong Python, những điều khoản sau đây không làm việc:tập tin Python Chế độ chi tiết

f = open("ftmp", "rw") 
print >> f, "python" 

tôi nhận được lỗi:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 9] Bad file descriptor 

Nhưng với đoạn mã sau hoạt động:

g = open("ftmp", "r+") 
print >> g, "python" 

Có vẻ như tôi cần phải sửa lại các chế độ tập tin. Những phức tạp sâu sắc của các chế độ mở tập tin là gì?

Trả lời

11

Như một sự bổ sung để @Jarret Hardie's answer dưới đây là cách chế độ Python tập séc trong hàm fileio_init():

s = mode; 
while (*s) { 
    switch (*s++) { 
    case 'r': 
     if (rwa) { 
     bad_mode: 
      PyErr_SetString(PyExc_ValueError, 
        "Must have exactly one of read/write/append mode"); 
      goto error; 
     } 
     rwa = 1; 
     self->readable = 1; 
     break; 
    case 'w': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT | O_TRUNC; 
     break; 
    case 'a': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT; 
     append = 1; 
     break; 
    case 'b': 
     break; 
    case '+': 
     if (plus) 
      goto bad_mode; 
     self->readable = self->writable = 1; 
     plus = 1; 
     break; 
    default: 
     PyErr_Format(PyExc_ValueError, 
       "invalid mode: %.200s", mode); 
     goto error; 
    } 
} 

if (!rwa) 
    goto bad_mode; 

Đó là: chỉ "rwab+" ký tự được phép; phải có chính xác một trong số "rwa", tối đa một số '+''b' là một nút.

+0

wow, làm thế nào trong khi (* s) và chuyển đổi (* s ++) hoạt động? oO Từ những gì tôi thấy, nó sẽ xé chuỗi char bằng char? Nhưng * * nghĩa là gì? – Qwerty

+2

@Qwerty: xem [Làm cách nào "while (* s ++ = * t ++)" hoạt động?] (Http://stackoverflow.com/questions/810129/how-does-whiles-t-work) để hiểu '* s' , '* s ++' trong C. – jfs

17

Tốt hơn, hãy để tài liệu làm điều đó cho bạn: http://docs.python.org/library/functions.html#open. Vấn đề của bạn trong câu hỏi là không có chế độ "rw" ... bạn có thể muốn 'r +' như bạn đã viết (hoặc 'a +' nếu tệp chưa tồn tại).

+12

Tài liệu không đủ. Nó không nói rằng bạn không thể có 'r' và' w'. Nó không nói sự khác biệt giữa 'w +' và 'w' là gì (chính xác là những gì" cập nhật "nghĩa là gì?), Và nó không nói nếu' a' tìm đến cuối tập tin (tôi giả sử nó , nhưng có thể không). Và nó không đưa ra một cách rõ ràng để mở một tập tin để đọc và viết, lúc đầu, mà không cắt xén nó. – Timmmm

0

Trong thực tế, điều này không quan trọng, nhưng tôi tìm thấy một chế độ "rw" trên các ổ cắm trong đoạn mã sau (đối với Python trên S60) tại đường 42 và 45:

http://www.mobilenin.com/mobilepythonbook/examples/057-btchat.html

+0

Xem http://docs.python.org/library/socket.html#module-socket. "Lưu ý Một số hành vi có thể phụ thuộc vào nền tảng, vì các cuộc gọi được thực hiện tới API socket của hệ điều hành". Vì vậy, nó có vẻ giống như một tính năng S60 cụ thể. –

+0

Tôi cũng chỉ ra rằng r + và a + cho phép cả đọc và ghi. Mở tệp bằng r + và bạn có thể tìm kiếm() xung quanh tệp theo ý muốn, ghi đè hoặc thêm nội dung. Có một tính năng mà bạn mong đợi rằng chuỗi '+' không cung cấp? –

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