2010-07-02 30 views
142
  1. Tần suất Python tuôn ra một tệp?
  2. Mức độ thường xuyên của Python tuôn ra để giảm giá?

Tôi không chắc chắn về (1).Làm thế nào thường python tuôn ra một tập tin?

Đối với (2), tôi tin rằng Python sẽ đẩy mạnh xuất chuẩn sau mỗi dòng mới. Nhưng, nếu bạn quá tải stdout để được vào một tập tin, nó tuôn ra như thường xuyên?

Trả lời

223

Đối với hoạt động tập tin, Python sử dụng đệm mặc định của hệ điều hành, trừ khi bạn cấu hình nó làm khác đi. Bạn có thể chỉ định kích thước bộ đệm, không bị chặn hoặc dòng đệm.

Ví dụ: hàm mở có đối số kích thước bộ đệm.

http://docs.python.org/library/functions.html#open

"Đối số đệm không bắt buộc quy định cụ thể của tập tin kích thước bộ đệm mong muốn: 0 có nghĩa là không có bộ đệm, 1 có nghĩa là dòng đệm, bất kỳ giá trị tích cực khác có nghĩa là sử dụng một bộ đệm của (ước tính) kích thước mà Một phương tiện đệm tiêu cực. để sử dụng mặc định của hệ thống, mà thường được dòng đệm cho các thiết bị tty và đầy đủ đệm cho các tập tin khác. Nếu bỏ qua, mặc định hệ thống được sử dụng. "

bufsize = 0 
f = open('file.txt', 'w', bufsize) 
+11

1 cho phần "dòng đệm". Đó là chính xác những gì tôi đang tìm kiếm và nó hoạt động như một sự quyến rũ. – rein

+0

Sử dụng Python 3.4.3 khi tôi làm 'mở ('file.txt', 'w', 1)' Tôi nhận được dòng đệm thích hợp. Nhưng nếu tôi làm bất cứ điều gì lớn hơn (tôi muốn 'mở ('file.txt', 'w', 512)') nó đệm toàn bộ 'io.DEFAULT_BUFFER_SIZE' của 8192. Đó có phải là lỗi Python, lỗi Linux hoặc một Lỗi ID10t? –

11

Tôi không biết điều này có áp dụng cho python hay không, nhưng tôi nghĩ nó phụ thuộc vào hệ điều hành bạn đang chạy.

Trên Linux chẳng hạn, đầu ra cho thiết bị đầu cuối xóa bộ đệm trên dòng mới, trong khi đầu ra cho các tệp, nó chỉ xóa khi bộ đệm đầy (theo mặc định). Điều này là do nó hiệu quả hơn để loại bỏ bộ đệm ít lần hơn, và người dùng ít có khả năng nhận thấy nếu đầu ra không được flushed trên một dòng mới trong một tệp.

Bạn có thể tự động tuôn ra đầu ra nếu đó là những gì bạn cần.

EDIT: Tôi nghĩ rằng bạn sẽ tự động tuôn ra trong python theo cách này (dựa từ here)

#0 means there is no buffer, so all output 
#will be auto-flushed 
fsock = open('out.log', 'w', 0) 
sys.stdout = fsock 
#do whatever 
fsock.close() 
107

Bạn cũng có thể buộc tuôn ra bộ đệm vào một tập tin trình với sốPhương pháp.

with open('out.log', 'w+') as f: 
    f.write('output is ') 
    # some work 
    s = 'OK.' 
    f.write(s) 
    f.write('\n') 
    f.flush() 
    # some other work 
    f.write('done\n') 
    f.flush() 

Tôi thấy hữu ích khi điều chỉnh tệp đầu ra với tail -f.

+23

Từ tài liệu: 'Lưu ý: flush() không nhất thiết ghi dữ liệu của tệp vào đĩa. Sử dụng flush() theo sau là os.fsync() để đảm bảo hành vi này.' – bobismijnnaam

+10

Trong ví dụ này lệnh này là 'os.fsync (f.fileno())' – juanmah

+0

@bobismijnnaam liên kết thời gian tới các tài liệu đã nói. Chỉ có tài liệu tham khảo tôi có thể tìm thấy là từ https://github.com/jprzywoski/python-reference/blob/master/source/docs/file/flush.rst và tôi không biết đó là ai. –

7

Bạn cũng có thể kiểm tra kích thước bộ đệm mặc định bằng cách gọi thuộc tính chỉ đọc DEFAULT_BUFFER_SIZE từ mô-đun io.

import io 
print (io.DEFAULT_BUFFER_SIZE) 
0

Đây là một cách tiếp cận khác, tối đa OP để chọn tùy chọn nào bạn thích.

Khi bao gồm cả mã dưới đây trong __init__ tập tin py trước khi các mã khác, các thông điệp được in với print và bất kỳ lỗi nào sẽ không còn được đăng nhập để log.txt Ableton nhưng đến tập tin riêng biệt trên đĩa của bạn:

import sys 

path = "/Users/#username#" 

errorLog = open(path + "/stderr.txt", "w", 1) 
errorLog.write("---Starting Error Log---\n") 
sys.stderr = errorLog 
stdoutLog = open(path + "/stdout.txt", "w", 1) 
stdoutLog.write("---Starting Standard Out Log---\n") 
sys.stdout = stdoutLog 

(dành cho Mac, thay đổi #username# thành tên thư mục người dùng của bạn.Trên Windows đường dẫn đến thư mục người dùng của bạn sẽ có định dạng khác)

Khi bạn mở tệp trong trình chỉnh sửa văn bản làm mới nội dung khi tệp trên đĩa bị thay đổi (ví dụ: Mac: TextEdit không nhưng TextWrangler có) , bạn sẽ thấy nhật ký được cập nhật trong thời gian thực.

Tín: Mã này đã được sao chép chủ yếu là từ các kịch bản kiểm soát bề mặt liveAPI bởi Nathan RAMELLA

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