Kodokon kodokon.com

ไฟล์และมอดูล: with, import, การจัดระเบียบ

อ่านและเขียนไฟล์อย่างสะอาดด้วย with แลกเปลี่ยนข้อมูลด้วย JSON และจัดระเบียบโค้ดของคุณให้เป็นมอดูลที่นำเข้าได้

10 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

การอ่านและเขียนไฟล์คืองานประจำวันของโปรแกรมจริง ไม่ว่าจะเป็นการส่งออกข้อมูล ล็อก หรือไฟล์ตั้งค่า คำสงวน with เปิดไฟล์และ รับประกันว่ามันจะถูกปิด แม้จะเกิดข้อผิดพลาดขึ้นกลางบล็อกก็ตาม นี่เป็นวิธีเดียวในระดับมืออาชีพที่ใช้เปิดไฟล์ หากไม่มีมัน การลืม close() อาจทำให้ข้อมูลเสียหายหรือใช้ทรัพยากรของระบบจนหมด

PYTHON
lines = ["alpha", "beta", "gamma"]

with open("notes.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")

with open("notes.txt", encoding="utf-8") as f:
    content = f.read()

print(content)
โหมด 'w' เขียนทับเนื้อหาเดิม ส่วนถ้าไม่ระบุโหมด คุณจะอ่านไฟล์

สำหรับข้อมูลที่มีโครงสร้าง อย่าคิดค้นรูปแบบของตัวเองขึ้นมา มอดูล json จากไลบรารีมาตรฐานแปลงดิกชันนารีและลิสต์ให้เป็นข้อความ และแปลงกลับได้ด้วย มันคือรูปแบบสากลสำหรับแลกเปลี่ยนข้อมูลระหว่างโปรแกรม API และไฟล์ตั้งค่า

PYTHON
import json

config = {"debug": True, "retries": 3}

with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, indent=2)

with open("config.json", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["retries"])  # 3
json.dump เขียนโครงสร้างลงไฟล์ ส่วน json.load สร้างมันกลับขึ้นมา

มอดูล (module) ก็คือไฟล์ .py ธรรมดา ๆ นั่นเอง import billing โหลด billing.py และรันเนื้อหาของมันเพียงครั้งเดียว จงจัดระเบียบโค้ดตามหน้าที่ความรับผิดชอบ - มอดูลหนึ่งสำหรับการวางบิล อีกมอดูลสำหรับการจัดเก็บข้อมูล - และวางคำสั่ง import ไว้ด้านบนสุดของไฟล์ การทดสอบ if __name__ == "__main__" แยกสองสถานการณ์ออกจากกัน เมื่อไฟล์ถูกรันโดยตรง มันจะทำงานในบล็อกนี้ แต่เมื่อถูกนำเข้า มันจะข้ามบล็อกนี้ไป

PYTHON
def compute_total(prices):
    return round(sum(prices), 2)

def main():
    print(compute_total([9.99, 4.5, 20.0]))

if __name__ == "__main__":
    main()
เนื้อหาของ billing.py นำเข้าได้จากทุกที่ และรันโดยตรงก็ได้
BASH
python billing.py
เมื่อรันแบบนี้ ไฟล์จะเรียก main() แต่ถ้าถูกนำเข้า มันจะไม่ทำอะไรเลย

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. ข้อได้เปรียบหลักของ with open(...) เหนือ open() เพียว ๆ คืออะไร?
    • ไฟล์ถูกปิดโดยอัตโนมัติ แม้ในกรณีที่เกิดข้อผิดพลาด
    • การอ่านไฟล์เร็วกว่า
    • ไฟล์จะถูกสร้างขึ้นถ้ายังไม่มี ไม่ว่าจะใช้โหมดใดก็ตาม
  2. โหมด "w" กับ "a" ต่างกันอย่างไร?
    • "w" เขียนทับเนื้อหาเดิม ส่วน "a" เขียนต่อท้าย
    • "w" เขียนข้อความ ส่วน "a" เขียนไบนารี
    • "w" สร้างไฟล์ขึ้นมา ส่วน "a" จะล้มเหลวถ้าไฟล์ยังไม่มี
  3. การทดสอบ if __name__ == "__main__" มีไว้เพื่ออะไร?
    • เพื่อตรวจสอบว่าไฟล์ชื่อ main.py จริงหรือไม่
    • เพื่อรันบล็อกโค้ดเฉพาะตอนที่ไฟล์ถูกรันโดยตรง
    • เพื่อป้องกันไม่ให้ไฟล์อื่นนำเข้ามอดูลนี้