Nattawut Phetmak
Jack of all Trades
โดยปรกติ ถ้าหากเราเก็บตัวแปรโดยแปลงเป็นข้อความ (ใช้ฟังก์ชัน repr()
) ลงในไฟล์ จะมีจุดอ่อนตรงที่เมื่อเปิดไฟล์นั้นๆ เราต้องเขียนตัวแปลงค่ามันให้อยู่ในรูปแบบตัวแปรที่ถูกต้องเสมอ
ใน Python มีโมดูลหนึ่งชื่อว่า pickle ที่ทำให้เราเก็บตัวแปรลงในไฟล์ได้ตรงๆ เลย เช่น
import pickle
pickle.dump(42, open('answer.pickle', 'wb'))
ปิดโปรแกรมแล้วเปิดขึ้นมาใหม่ แล้วเรียกใช้ตัวแปรที่เราเก็บไว้ได้ดังนี้
import pickle
print(pickle.load(open('answer.pickle', 'rb')))
# get: 42
อย่างไรก็ดี เราไม่สามารถเปิดอ่านข้อมูลที่ pickle เก็บไว้ได้รู้เรื่อง เพราะมันจะถูกเก็บเป็น data structure ของ Python นั่นเอง
print(open('answer.pickle', 'rb').read())
# get: b'\x80\x03K*.'
ที่สำคัญที่สุดคือ การ load ข้อมูลจากไฟล์ที่โดน pickle ไปนั้น ต้องมั่นใจว่าไฟล์นั้นๆ ปลอดภัยจริงนะครับ
สำหรับข้อมูลที่ pickle สามารถจัดเก็บไว้ได้ มีดังนี้
สำหรับการใช้ pickle เก็บข้อมูลแบบสุดท้ายนั้น จะเก็บแค่ชื่อ/ตำแหน่งที่อยู่ฟังก์ชันให้เท่านั้น เช่น
import pickle
def hello():
print('say hi!')
pickle.dump(hello, open('hello.pickle', 'wb'))
ครั้งต่อๆ ไปก่อนที่เราจะโหลดข้อมูลเหล่านั้นมาใช้ได้ ต้องทำการประกาศฟังก์ชัน, คลาสนั้นๆ ให้เรียบร้อยก่อน ซึ่งต้องระวังในกรณีที่การประกาศฟังก์ชัน, คลาสเปลี่ยนไปจากเดิมครับ
import pickle
def hello():
print('ho ho ho')
load_function = pickle.load(open('hello.pickle', 'rb'))
load_function()
# get: ho ho ho