अजगर कितनी बार किसी फाइल को फ्लश करता है?


228
  1. पायथन एक फ़ाइल को कितनी बार फ्लश करता है?
  2. पायथन स्टडआउट को कितनी बार फ्लश करता है?

मैं (1) के बारे में अनिश्चित हूं।

(2) के रूप में, मेरा मानना ​​है कि पायथन फ्लश करने के लिए हर नई लाइन के बाद। लेकिन, यदि आप एक फाइल के लिए stdout को अधिभारित करते हैं, तो क्या यह अक्सर फ्लश करता है?

जवाबों:


332

फ़ाइल संचालन के लिए, पायथन ऑपरेटिंग सिस्टम की डिफ़ॉल्ट बफरिंग का उपयोग करता है जब तक कि आप इसे कॉन्फ़िगर न करें अन्यथा। आप बफर आकार, असंबद्ध या लाइन बफ़र निर्दिष्ट कर सकते हैं।

उदाहरण के लिए, खुला कार्य एक बफर आकार तर्क लेता है।

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

"वैकल्पिक बफरिंग तर्क फ़ाइल के वांछित बफर आकार को निर्दिष्ट करता है:"

  • ० का अर्थ है अप्रभावित,
  • 1 का मतलब है लाइन बफर,
  • किसी भी अन्य सकारात्मक मूल्य का मतलब उस आकार के (लगभग) बफर का उपयोग करना है।
  • एक नकारात्मक बफ़रिंग का अर्थ है सिस्टम डिफॉल्ट का उपयोग करना, जो आमतौर पर छोटे उपकरणों के लिए लाइन बफ़र और अन्य फ़ाइलों के लिए पूरी तरह से बफ़र किया जाता है।
  • यदि छोड़ा गया है, तो सिस्टम डिफ़ॉल्ट का उपयोग किया जाता है।

कोड:

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

23
"लाइन बफर" भाग के लिए +1। ठीक यही मैं देख रहा था और यह एक आकर्षण की तरह काम करता है।
लगाम

2
पायथॉन 3.4.3 का उपयोग करते समय जब मैं करता open('file.txt', 'w', 1)हूं मुझे उचित लाइन बफरिंग मिलती है। लेकिन अगर मैं कुछ बड़ा करता हूं (मैं चाहता था open('file.txt', 'w', 512)) यह io.DEFAULT_BUFFER_SIZE8192 से भरा है । क्या वह पायथन बग, लिनक्स बग या आईडी 10 टी बग है?
ब्रूनो ब्रोंस्की

क्या पहले से ही खुली धाराओं के लिए बफरिंग को बदलना संभव है ? कहो, मैं इस stdoutबात की परवाह किए बिना लाइन-बफ़र होना चाहता हूं कि यह कंसोल है या फ़ाइल पर रीडायरेक्ट?
मिखाइल टी।

1
@CharlieParker जब आप write()फ़ाइल हैंडल पर कॉल करते हैं , तो आउटपुट मेमोरी में बफ़र हो जाता है और बफर के भरे होने तक जमा होता है ... जिस समय बफर "फ्लश" हो जाता है (सामग्री बफर से फ़ाइल में लिखी जाती है)। आप flush()फ़ाइल हैंडल पर विधि को कॉल करके स्पष्ट रूप से बफर को फ्लश कर सकते हैं ।
कोरी गोल्डबर्ग

3
ध्यान दें कि असंबद्ध (0) केवल बाइनरी मोड में उपलब्ध है और लाइन बफ़र्ड (1) केवल टेक्स्ट मोड में उपलब्ध है।
ZaydH

172

आप किसी फ़ाइल को प्रोग्राम के साथ बफर को फ्लश कर सकते हैं 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()

मुझे यह उपयोगी तब मिला है जब एक आउटपुट फाइल को साथ ला रहा हूं tail -f


54
डॉक्स से:Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
bobismijnnaam

1
@bobismijnnaam अगली बार लिंक डॉक्स के लिए। केवल जो संदर्भ मैं पा सकता हूं वह github.com/jprzywoski/python-reference/blob/master/source/docs/… से है और मुझे नहीं पता कि वह कौन है।
ब्रूनो ब्रोंस्की

5
@ ब्रूनो ब्रोंस्की अच्छा बिंदु। डॉक्स: Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
bobismijnnaam

मैं जो उलझन में हूं वह यह है कि इस शब्द का flushingअर्थ क्या है। हमें इसकी जरूरत क्यों है? ये किसके लिये है? मुझे इसकी परवाह क्यों करनी चाहिए?
चार्ली पार्कर

@CharlieParker जब आप लिखते हैं, तो आप रैम में फ़ाइल की (का हिस्सा) की एक प्रति को लिखते हैं, जिसे शायद थोड़ी देर के लिए डिस्क पर सहेजा नहीं जा सकता है। यह प्रदर्शन में सुधार करता है, लेकिन डेटा हानि का मतलब हो सकता है यदि वह प्रतिलिपि कभी नहीं लिखी जाती है (डिस्क हटा दी गई, ओएस क्रैश, आदि)। फ्लश () पायथन को तुरंत उस बफर को डिस्क पर लिखने के लिए कहता है। (फिर, os.fsync () ओएस बताता भी यह करने के लिए बफ़र्स की कई परतें हैं ...।)
रेना

13

मुझे नहीं पता कि क्या यह अजगर पर भी लागू होता है, लेकिन मुझे लगता है कि यह उस ऑपरेटिंग सिस्टम पर निर्भर करता है जो आप चला रहे हैं।

उदाहरण के लिए लिनक्स पर, टर्मिनल पर आउटपुट बफर को एक नई रेखा पर फ्लश करता है, जबकि आउटपुट के लिए यह फाइल केवल तभी फ्लश करता है जब बफर भरा हुआ होता है (डिफ़ॉल्ट रूप से)। ऐसा इसलिए है क्योंकि बफर को कम बार फ्लश करने के लिए यह अधिक कुशल है, और उपयोगकर्ता को नोटिस करने की संभावना कम है कि क्या आउटपुट किसी फ़ाइल में एक नई लाइन पर फ्लश नहीं किया गया है।

आप आउटपुट को ऑटो-फ्लश करने में सक्षम हो सकते हैं यदि ऐसा है तो आपको क्या चाहिए।

संपादित करें: मुझे लगता है कि आप अजगर को इस तरह से ऑटो-फ्लश करेंगे ( यहाँ से आधारित )

#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

आप केवल io मॉड्यूल से DEFAULT_BUFFER_SIZE विशेषता पढ़कर कॉल करके डिफ़ॉल्ट बफर आकार की भी जांच कर सकते हैं।

import io
print (io.DEFAULT_BUFFER_SIZE)

1
धन्यवाद! यह जानना अच्छा है कि अजगर इसे ओएस परिभाषित करता है ... लेकिन यह पता लगाने में मदद करता है कि ओएस पूर्व क्या परिभाषित करता है।
कोमटॉन्ग

2

यहाँ एक और दृष्टिकोण है, ओपी तक जो वह चुनना चाहता है।

__init__किसी भी अन्य कोड से पहले .py फ़ाइल के नीचे दिए गए कोड को शामिल करते समय , printकिसी भी त्रुटि के साथ मुद्रित किए गए संदेश अब Ableton के Log.txt पर लॉग नहीं किए जाएंगे, लेकिन आपकी डिस्क पर फ़ाइलों को अलग करने के लिए:

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

(मैक के लिए, #username#अपने उपयोगकर्ता फ़ोल्डर के नाम में परिवर्तन करें। विंडोज पर आपके उपयोगकर्ता फ़ोल्डर के लिए पथ का एक अलग प्रारूप होगा)

जब आप एक पाठ संपादक में फ़ाइलों को खोलते हैं जो डिस्क पर फ़ाइल को बदलने पर इसकी सामग्री को ताज़ा करता है (उदाहरण के लिए Mac: TextEdit नहीं करता है लेकिन TextWrangler करता है), तो आप देखेंगे कि लॉग वास्तविक समय में अपडेट किए जा रहे हैं।

क्रेडिट: इस कोड को ज्यादातर नाथन रमेला द्वारा लाइवएपीआई नियंत्रण सतह स्क्रिप्ट से कॉपी किया गया था

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.