Context manager แบบ open() อ่านอย่างเดียว
คุณมีไฟล์ข้อมูลจำนวนมากสำหรับโปรเจกต์ deep learning ที่ใช้เวลาหลายเดือนในการรวบรวมและทำความสะอาด คงจะแย่มากหากเขียนทับไฟล์เหล่านั้นโดยไม่ตั้งใจขณะพยายามอ่านเพื่อนำไปเทรนโมเดล ดังนั้นจึงตัดสินใจสร้าง context manager ของ open() แบบอ่านอย่างเดียวสำหรับใช้ในโปรเจกต์นี้
โดยปกติ open() context manager จะ:
- รับชื่อไฟล์และโหมด (
'r'สำหรับอ่าน,'w'สำหรับเขียน หรือ'a'สำหรับต่อท้าย) - เปิดไฟล์เพื่ออ่าน เขียน หรือต่อท้าย
- ส่งการควบคุมกลับไปยัง context พร้อมกับการอ้างอิงไปยังไฟล์
- รอให้ context ทำงานเสร็จ
- แล้วจึงปิดไฟล์ก่อนออก
Context manager ที่จะสร้างนี้ทำงานแบบเดียวกัน ต่างกันตรงที่รับเฉพาะชื่อไฟล์เป็น argument และเปิดไฟล์เพื่ออ่านเท่านั้น
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การเขียนฟังก์ชันใน Python
คำแนะนำการฝึกหัด
- ส่งการควบคุมจาก
open_read_only()ไปยัง context block โดยให้ออบเจกต์read_only_fileถูกกำหนดให้กับmy_file - ใช้เมธอด
.close()ของread_only_fileเพื่อให้แน่ใจว่าไม่มีไฟล์ที่เปิดค้างอยู่
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
@contextlib.contextmanager
def open_read_only(filename):
"""Open a file in read-only mode.
Args:
filename (str): The location of the file to read
Yields:
file object
"""
read_only_file = open(filename, mode='r')
# Yield read_only_file so it can be assigned to my_file
____ ____
# Close read_only_file
____.____()
with open_read_only('my_file.txt') as my_file:
print(my_file.read())