Pickle

โดยปรกติ ถ้าหากเราเก็บตัวแปรโดยแปลงเป็นข้อความ (ใช้ฟังก์ชัน 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 สามารถจัดเก็บไว้ได้ มีดังนี้

  • ค่าตัวแปร None, True, False
  • ตัวเลขแบบ int, float, complex
  • ข้อความแบบ string, byte, bytearray
  • ตัวแปรชุดแบบ tuple, list, set, dictionary
  • “ที่อยู่” ของฟังก์ชัน, คลาส, object (ไม่เก็บ code ในฟังก์ชันให้นะครับ)

สำหรับการใช้ 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

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus