2010-03-15 38 views

Trả lời

27

Có. Nó sử dụng hàm close() nằm bên dưới để thực hiện điều đó cho bạn (source).

+2

(Nói cách khác: Tập tin I/O được đệm được trừu tượng hóa lớn và bị ẩn khỏi bạn. Làm một 'mở',' viết', 'gần' không được để lại những thứ không được viết như bạn đã dự định Một bộ đệm thường xuyên ăn những gì được ném vào nó sẽ là một thiết kế khá xấu [hoặc một bộ đệm đói].) – Joey

+1

Cảm ơn, đó là dự đoán của tôi quá. Nhưng đây có phải là nền tảng chéo, cross-OS và cross-languages ​​thực sự không? –

+0

@Adam Matan: Đó là lý do Python nằm trên các thư viện C. Để đảm bảo rằng "nền tảng chéo, hệ điều hành thực sự" này. Tôi không biết "cross-languages" có nghĩa là gì. –

14

NB: close()flush() sẽ không đảm bảo rằng dữ liệu thực sự an toàn trên đĩa. Nó chỉ đảm bảo rằng hệ điều hành có dữ liệu == rằng nó không được đệm bên trong tiến trình.

Bạn có thể thử đồng bộ hóa hoặc fsync để nhận dữ liệu được ghi vào đĩa.

+0

True, nhưng không phải hệ điều hành hiện đại ghi dữ liệu vào đĩa khi chấm dứt quá trình? –

+0

Phụ thuộc vào quy mô thời gian bạn đang nói đến. ví dụ. một số phiên bản của ext4 có thể chờ cả giây trước khi cam kết dữ liệu của bạn vào đĩa. –

+0

+1 Nếu thứ tự độ lớn là giây, tôi khá an toàn. Cảm ơn! –

-5

filehandle.close không nhất thiết phải tuôn ra. Đáng ngạc nhiên, filehandle.flush không giúp được gì cả --- nó vẫn có thể bị kẹt trong bộ đệm hệ điều hành khi Python đang chạy. Quan sát phiên này, nơi tôi đã viết vào một tập tin, đóng nó và Ctrl-Z để dấu nhắc lệnh shell và kiểm tra các tập tin:

$ cat xyz 
ghi 
$ fg 
python 

>>> x=open("xyz","a") 
>>> x.write("morestuff\n") 
>>> x.write("morestuff\n") 
>>> x.write("morestuff\n") 
>>> x.flush 
<built-in method flush of file object at 0x7f58e0044660> 
>>> x.close 
<built-in method close of file object at 0x7f58e0044660> 
>>> 
[1]+ Stopped     python 
$ cat xyz 
ghi 

Sau đó tôi có thể mở lại tập tin, và rằng nhất thiết phải đồng bộ hóa các tập tin (bởi vì, trong trường hợp này, tôi mở nó ở chế độ phụ thêm). Như những người khác đã nói, syscall đồng bộ (có sẵn từ gói os) nên tuôn ra tất cả các bộ đệm vào đĩa nhưng nó có thể có tác động toàn hệ thống (nó đồng bộ tất cả các tệp trên hệ thống).

+13

Hm - Tôi nghi ngờ vấn đề của bạn là bạn không thực sự ** gọi ** 'flush()' hoặc 'close()' - bạn vừa kết thúc hiển thị biểu diễn của họ! Bạn cần parens để gọi những phương pháp đó. –

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