- Python ล้างข้อมูลในไฟล์บ่อยแค่ไหน?
- Python ล้างข้อมูลเพื่อ stdout บ่อยเพียงใด
ฉันไม่แน่ใจเกี่ยวกับ (1)
สำหรับ (2) ฉันเชื่อว่า Python จะล้างออกเพื่อ stdout หลังจากทุกบรรทัดใหม่ แต่ถ้าคุณโอเวอร์โหลด stdout ไปที่ไฟล์มันจะล้างบ่อยไหม?
ฉันไม่แน่ใจเกี่ยวกับ (1)
สำหรับ (2) ฉันเชื่อว่า Python จะล้างออกเพื่อ stdout หลังจากทุกบรรทัดใหม่ แต่ถ้าคุณโอเวอร์โหลด stdout ไปที่ไฟล์มันจะล้างบ่อยไหม?
คำตอบ:
สำหรับการทำงานของไฟล์ Python ใช้การบัฟเฟอร์เริ่มต้นของระบบปฏิบัติการเว้นแต่คุณจะกำหนดค่าไว้ คุณสามารถระบุขนาดบัฟเฟอร์ไม่บัฟเฟอร์หรือบัฟเฟอร์บรรทัด
ตัวอย่างเช่นฟังก์ชั่นเปิดใช้เวลาอาร์กิวเมนต์ขนาดบัฟเฟอร์
http://docs.python.org/library/functions.html#open
"อาร์กิวเมนต์บัฟเฟอร์ทางเลือกระบุขนาดบัฟเฟอร์ที่ต้องการของไฟล์:"
รหัส:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
ฉันได้รับบัฟเฟอร์บรรทัดที่เหมาะสม แต่ถ้าฉันทำสิ่งที่ใหญ่กว่านี้ (ฉันต้องการopen('file.txt', 'w', 512)
) มันจะบัฟเฟอร์เต็มio.DEFAULT_BUFFER_SIZE
8192 นั่นคือข้อผิดพลาด Python, ข้อผิดพลาด Linux หรือข้อผิดพลาด ID10t?
stdout
ที่จะบัฟเฟอร์บรรทัดโดยไม่คำนึงว่ามันเป็นคอนโซลหรือเปลี่ยนเส้นทางไปยังไฟล์หรือไม่?
write()
ใช้ตัวจัดการไฟล์เอาต์พุตจะถูกบัฟเฟอร์ในหน่วยความจำและสะสมจนบัฟเฟอร์เต็ม ... เวลาที่บัฟเฟอร์ได้รับ "flushed" (เนื้อหาถูกเขียนจากบัฟเฟอร์ไปยังไฟล์) คุณสามารถล้างบัฟเฟอร์อย่างชัดเจนโดยเรียกflush()
วิธีการในการจัดการไฟล์
นอกจากนี้คุณยังสามารถบังคับให้ล้างบัฟเฟอร์ไปยังแฟ้มโดยทางโปรแกรมด้วย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()
ฉันได้พบว่ามีประโยชน์นี้เมื่อ tailing tail -f
ไฟล์ที่ส่งออกด้วย
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
ว่าหมายถึง ทำไมเราต้องการมัน? มีไว้เพื่ออะไร? ทำไมฉันถึงต้องแคร์?
ฉันไม่ทราบว่าสิ่งนี้ใช้ได้กับงูใหญ่เช่นกัน แต่ฉันคิดว่ามันขึ้นอยู่กับระบบปฏิบัติการที่คุณใช้งานอยู่
บน Linux ตัวอย่างเช่นเอาต์พุตไปยังเทอร์มินัลล้างบัฟเฟอร์ในบรรทัดใหม่ขณะที่เอาต์พุตไปยังไฟล์จะล้างเฉพาะเมื่อบัฟเฟอร์เต็ม (โดยค่าเริ่มต้น) นี่เป็นเพราะมันจะมีประสิทธิภาพมากขึ้นในการล้างบัฟเฟอร์น้อยลงและผู้ใช้มีโอกาสน้อยที่จะสังเกตเห็นว่าการส่งออกไม่ได้ล้างบนบรรทัดใหม่ในไฟล์
คุณอาจสามารถล้างเอาต์พุตอัตโนมัติถ้านั่นคือสิ่งที่คุณต้องการ
แก้ไข: ฉันคิดว่าคุณจะล้างอัตโนมัติใน python ด้วยวิธีนี้ (จากที่นี่ )
#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()
คุณยังสามารถตรวจสอบขนาดบัฟเฟอร์เริ่มต้นได้ด้วยการเรียกใช้แอตทริบิวต์ DEFAULT_BUFFER_SIZE แบบอ่านอย่างเดียวจากโมดูล io
import io
print (io.DEFAULT_BUFFER_SIZE)
นี่คือวิธีการอื่นจนถึง OP เพื่อเลือกสิ่งที่เขาต้องการ
เมื่อรวมรหัสด้านล่างใน__init__
ไฟล์. py ก่อนรหัสอื่นข้อความที่พิมพ์ด้วยprint
และข้อผิดพลาดใด ๆ จะไม่ถูกบันทึกลงใน Log.txt ของ Ableton อีกต่อไป แต่จะแยกไฟล์ต่าง ๆ ในดิสก์ของคุณ:
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
(สำหรับ Mac ให้เปลี่ยน #username#
เป็นชื่อโฟลเดอร์ผู้ใช้ของคุณบน Windows เส้นทางไปยังโฟลเดอร์ผู้ใช้ของคุณจะมีรูปแบบที่แตกต่างกัน)
เมื่อคุณเปิดไฟล์ในเท็กซ์เอดิเตอร์ที่รีเฟรชเนื้อหาเมื่อไฟล์บนดิสก์มีการเปลี่ยนแปลง (ตัวอย่างสำหรับ Mac: TextEdit ไม่ได้ แต่ TextWrangler ทำ) คุณจะเห็นบันทึกที่อัปเดตตามเวลาจริง
เครดิต: รหัสนี้ถูกคัดลอกมาส่วนใหญ่มาจากสคริปต์พื้นผิวการควบคุม liveAPI โดย Nathan Ramella