เขียน generator เพื่อโหลดข้อมูลทีละส่วน (2)
ในแบบฝึกหัดก่อนหน้า คุณได้ประมวลผลไฟล์ทีละบรรทัดสำหรับจำนวนบรรทัดที่กำหนด แต่ถ้าต้องการทำแบบนี้กับทั้งไฟล์ล่ะ?
ในกรณีนี้ การใช้ generators จะเป็นประโยชน์มาก Generators ช่วยให้ผู้ใช้สามารถ ประเมินค่าแบบ lazy ได้ แนวคิด lazy evaluation มีประโยชน์มากเมื่อต้องจัดการกับชุดข้อมูลขนาดใหญ่ เพราะช่วยให้สร้างค่าได้อย่างมีประสิทธิภาพโดย yield ข้อมูลออกมาทีละส่วนแทนที่จะโหลดทั้งหมดในครั้งเดียว
ในแบบฝึกหัดนี้ คุณจะเขียนฟังก์ชัน generator ชื่อ read_large_file() ซึ่งสร้าง generator object ที่ yield ข้อมูลทีละบรรทัดจากไฟล์ทุกครั้งที่เรียก next() ไฟล์ CSV 'world_dev_ind.csv' อยู่ในไดเรกทอรีปัจจุบันพร้อมให้ใช้งานแล้ว
สังเกตว่าเมื่อเปิดการเชื่อมต่อกับไฟล์ ออบเจกต์ไฟล์ที่ได้จะเป็น generator อยู่แล้ว! ดังนั้นในการใช้งานจริง คุณไม่จำเป็นต้องสร้าง generator object อย่างชัดเจนในกรณีเช่นนี้ อย่างไรก็ตาม เพื่อเป็นการฝึกทักษะ เราจึงให้คุณฝึกเขียนด้วยฟังก์ชัน read_large_file() นี้ ลองทำดูเลย!
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Python Toolbox
คำแนะนำการฝึกหัด
- ในฟังก์ชัน
read_large_file()ให้อ่านหนึ่งบรรทัดจากfile_objectโดยใช้เมธอดreadline()แล้วกำหนดผลลัพธ์ให้กับdata - ในฟังก์ชัน
read_large_file()ให้yieldบรรทัดที่อ่านได้จากไฟล์data - ใน context manager ให้สร้าง generator object ชื่อ
gen_fileโดยเรียกฟังก์ชัน generatorread_large_file()และส่งfileเข้าไป - พิมพ์สามบรรทัดแรกที่ได้จาก generator object
gen_fileโดยใช้next()
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Define read_large_file()
def read_large_file(file_object):
"""A generator function to read a large file lazily."""
# Loop indefinitely until the end of the file
while True:
# Read a line from the file: data
data = ____
# Break if this is the end of the file
if not data:
break
# Yield the line of data
# Open a connection to the file
with open('world_dev_ind.csv') as file:
# Create a generator object for the file: gen_file
gen_file = ____
# Print the first three lines of the file
print(____)
print(____)
print(____)