2015-07-19 14 views
19

Tôi nhận thấy rằng, ngoài các ký tự chế độ được ghi tài liệu, Python 2.7.5.1 trong Windows XP và 8.1 cũng chấp nhận các chế độ UD ít nhất khi đọc tệp. Chế độ U được sử dụng trong số genfromtxt của numpy. Chế độ D có hiệu quả mà các tập tin bị xóa, theo các đoạn mã sau:Chế độ chức năng mở tập tin Python

f = open('text.txt','rD') 
print(f.next()) 
f.close() # file text.txt is deleted when closed 

Có ai biết thêm về các chế độ, đặc biệt là cho dù họ là một tính năng thường trực của ngôn ngữ được áp dụng cũng trên hệ thống Linux?

+3

'mở ('text.txt', 'rD')' đối với tệp hiện có trên Linux không gây ra bất kỳ lỗi nào cho tôi, mặc dù tệp không bị xóa khi đóng. Tôi thực sự ngạc nhiên rằng nếu đúng, hành vi này là [không ghi lại] (https://docs.python.org/2/library/functions.html#open). Cờ 'U' được ghi lại. – rth

+2

Chỉ cần sao chép điều này trên Windows. Điều này thực sự rất kỳ quặc. – tmr232

+3

Tôi đã phạm sai lầm tương tự một lúc trước. Đề cập đến là [ở đây] (https://github.com/python/cpython/blob/2.7/Objects/fileobject.c#L209). Trong fileobject và không phải là io. – tmr232

Trả lời

8

Cờ D dường như là Windows cụ thể. Windows dường như thêm nhiều cờ vào hàm fopen trong CRT của nó, như được mô tả here.

Trong khi Python lọc chuỗi chế độ để đảm bảo không có lỗi phát sinh từ nó, nó cho phép một số cờ đặc biệt, như có thể thấy trong các nguồn Python here. Cụ thể, có vẻ như cờ N được lọc ra, trong khi TD cờ được phép:

while (*++mode) { 
    if (*mode == ' ' || *mode == 'N') /* ignore spaces and N */ 
     continue; 
    s = "+TD"; /* each of this can appear only once */ 
    ... 

tôi sẽ đề nghị gắn bó với các tùy chọn tài liệu để giữ mã cross-platform.

+3

Cũng xem tài liệu trên Windows [CreateFile] (https://msdn.microsoft.com/en-us/library/windows/desktop /aa363858%28v=vs.85%29.aspx). –

+2

"Tôi khuyên bạn nên gắn bó với các tùy chọn được ghi lại" yay! Xem thêm [module tempfile] (https://docs.python.org/2/library/tempfile.html?highlight=tempfile#tempfile.TemporaryFile) – msw

5

Đây là một chút gây hiểu lầm. open() làm chế độ arg chấp nhận bất kỳ ký tự nào trong khi bạn chuyển một ký tự hợp lệ, ví dụ: "w,r,b,+,a".

Vì vậy, bạn có thể viết: open("fname", "w+ANYTHINGYOUWANT"). Nó sẽ mở tệp dưới dạng open("fname", "w+"). Và open("fname", "rANYTHINGYOUWANT"). sẽ mở tệp dưới dạng open("fname", "w+").

Về chữ "U" cờ:

Ngoài các tiêu chuẩn fopen() giá trị chế độ có thể 'U' hoặc 'RU'. Python thường được xây dựng với hỗ trợ dòng mới phổ quát; cung cấp 'U' mở tệp dưới dạng tệp văn bản nhưng các dòng có thể bị chấm dứt bởi bất kỳ điều sau: quy ước cuối dòng Unix '\ n', quy ước Macintosh '\ r' hoặc Windows quy ước '\ r \ n'. Tất cả các đại diện bên ngoài này được chương trình Python xem là '\ n'. Nếu Python được tạo mà không có dòng mới phổ quát, hỗ trợ chế độ có chữ 'U' là giống như chế độ văn bản thông thường. Lưu ý rằng các đối tượng tệp được mở cũng có thuộc tính được gọi là dòng mới có giá trị là Không (nếu không có dòng mới), '\ n', '\ r', '\ r \ n' hoặc một tuple chứa tất cả các loại dòng mới được nhìn thấy.

Như bạn có thể đọc trong tài liệu Python https://docs.python.org/2/library/functions.html#open

EDIT:

D: Chỉ định một tập tin tạm thời. Nó sẽ bị xóa khi tập tin cuối cùng con trỏ bị đóng.

như bạn có thể đọc trong liên kết @ tmr232.

Các c, n, t, S, R, T và D tùy chọn chế độ là Microsoft mở rộng cho fopen và _fdopen và không nên được sử dụng khi ANSI Portability là mong muốn

Cập nhật thêm:

Tôi đề xuất gửi hiện tượng dưới dạng lỗi, vì mở tệp dưới dạng chỉ đọc với cờ "r", sau đó cho phép xóa sau/qua đóng nó thêm một ký tự đơn như "D", thậm chí vô tình là một vấn đề an ninh nghiêm trọng, tôi nghĩ vậy.

Nhưng, nếu điều này có một số chức năng không thể tránh khỏi, vui lòng thông báo cho tôi.

+1

Tôi không thể tái tạo điều đó, nhưng có lẽ đây là một số vấn đề về tệp tiềm ẩn khác, tôi cho rằng? – Geeocode

+1

@rth nó được sao chép thấy phản hồi tmr232 ở trên, bạn vui lòng cung cấp cho một tài liệu tham khảo cho tài liệu U? – NameOfTheRose

+0

@ GyörgySolymosi bạn vui lòng cung cấp phiên bản python và os – NameOfTheRose

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