Làm thế nào thường xuyên python tuôn ra một tập tin?


228
  1. Làm thế nào thường xuyên Python tuôn ra một tập tin?
  2. Làm thế nào thường xuyên Python tuôn ra thiết bị xuất chuẩn?

Tôi không chắc chắn về (1).

Đối với (2), tôi tin rằng Python tuôn ra tiêu chuẩn sau mỗi dòng mới. Nhưng, nếu bạn quá tải thiết bị xuất chuẩn vào một tập tin, nó có thường xuyên bị xóa không?

Câu trả lời:


332

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

Ví dụ, hàm mở lấy đối số kích thước bộ đệm.

http://docs.python.org/l Library / fiances.html # open

"Đối số bộ đệm tùy chọn chỉ định kích thước bộ đệm mong muốn của tệp:"

  • 0 có nghĩa là không có bộ đệm,
  • 1 có nghĩa là dòng đệm,
  • bất kỳ giá trị dương nào khác có nghĩa là sử dụng bộ đệm có kích thước (xấp xỉ).
  • Bộ đệm âm có nghĩa là sử dụng mặc định hệ thống, thường là bộ đệm dòng cho các thiết bị tty và được đệm hoàn toàn cho các tệp khác.
  • Nếu bỏ qua, mặc định hệ thống được sử dụng.

mã:

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

23
+1 cho phần "dòng đệm". Đó chính xác là những gì tôi đang tìm kiếm và nó hoạt động như một bùa mê.
kiềm chế

2
Sử dụng Python 3.4.3 khi open('file.txt', 'w', 1)tôi nhận được bộ đệm dòng 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 open('file.txt', 'w', 512)) thì nó có đầy đủ io.DEFAULT_BUFFER_SIZE8192. Đó có phải là lỗi Python, lỗi Linux hay lỗi ID10t không?
Bruno Bronosky

Có thể thay đổi bộ đệm cho các luồng đã mở không? Nói, tôi muốn stdoutđược đệm dòng bất kể đó là bàn điều khiển hay chuyển hướng đến một tập tin?
Mikhail T.

1
@CharlieParker khi bạn gọi write()xử lý tệp, đầu ra được đệm trong bộ nhớ và được tích lũy cho đến khi bộ đệm đầy ... tại thời điểm bộ đệm bị "xóa" (nội dung được ghi từ bộ đệm vào tệp). Bạn có thể xóa bộ đệm một cách rõ ràng bằng cách gọi flush()phương thức trên một tệp xử lý.
Corey Goldberg

3
Lưu ý rằng không có bộ đệm (0) chỉ khả dụng ở chế độ nhị phân và bộ đệm dòng (1) chỉ khả dụng trong chế độ văn bản.
ZaydH

172

Bạn cũng có thể buộc tuôn bộ đệm vào một tệp theo chương trình flush().

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 đã tìm thấy điều này hữu ích khi theo đuôi một tập tin đầu ra tail -f.


54
Từ các tài liệu:Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
bobismijnnaam 7/10/2015

1
@bobismijnnaam lần sau liên kết đến 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ừ github.com/jprzywoski/python-reference/blob/master/source/docs/ Kẻ và tôi không biết đó là ai.
Bruno Bronosky

5
@Bruno Bronosky Điểm tốt. Tài liệu: Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
bobismijnnaam

những gì tôi đang bối rối là những gì thuật ngữ flushingthậm chí có nghĩa. Tại sao chúng ta cần nó? Nó dùng để làm gì? Tại sao tôi nên quan tâm đến nó?
Charlie Parker

@CharlieParker khi bạn viết, bạn ghi vào một bản sao của (một phần) tệp trong RAM, có thể không được lưu vào đĩa trong một thời gian. Nó cải thiện hiệu suất, nhưng có thể có nghĩa là mất dữ liệu nếu bản sao đó không bao giờ được ghi (đĩa bị xóa, sự cố hệ điều hành, v.v.). flush () bảo Python lập tức ghi bộ đệm đó trở lại đĩa. (Sau đó, os.fsync () bảo HĐH cũng làm điều đó. Có nhiều lớp bộ đệm ...)
Rena

13

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

Ví dụ, trên Linux, đầu ra cho thiết bị đầu cuối sẽ xóa bộ đệm trên một dòng mới, trong khi đối với đầ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 hiệu quả hơn để xóa bộ đệm ít lần hơn và người dùng sẽ ít chú ý hơn nếu đầu ra không được tuôn ra trên một dòng mới trong một tệp.

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

EDIT: Tôi nghĩ rằng bạn sẽ tự động xả bằng python theo cách này (dựa trên đây )

#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()

12

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 DEFAULT_BUFFER_SIZE chỉ đọc từ mô-đun io.

import io
print (io.DEFAULT_BUFFER_SIZE)

1
Cảm ơn! Thật tốt khi biết rằng python đặt nó làm HĐH xác định ... nhưng điều này giúp tìm ra những gì HĐH định nghĩa trước.
Cometsong

2

Đây là một cách tiếp cận khác, tùy thuộc vào OP để chọn cái nào anh ta thích.

Khi bao gồm mã bên dưới trong __init__tệp .py trước bất kỳ mã nào khác, các thông báo được in printvà mọi lỗi sẽ không còn được ghi vào Log.txt của Ableton mà để tách các tệp 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

(đối với 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ở các tệp trong trình soạn thảo văn bản để làm mới nội dung của nó khi tệp trên đĩa bị thay đổi (ví dụ cho Mac: TextEdit không nhưng TextWrangler thì không), bạn sẽ thấy các bản ghi được cập nhật theo thời gian thực.

Tín dụng: mã này được sao chép chủ yếu từ các kịch bản bề mặt kiểm soát liveAPI của Nathan Ramella

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.