2.27. การอ่านและเขียน

ไฟล์อยู่บนดิสก์ Python เข้าถึงได้ผ่าน open() ซึ่งคืน file object ที่มีเมธอดสำหรับอ่านและเขียน bytes พื้นฐาน

2.27.1. open และ modes

อาร์กิวเมนต์แรกคือ path อาร์กิวเมนต์ที่สองคือ mode ซึ่งเป็น string สั้นที่บอก Python ว่าไฟล์จะถูกใช้อย่างไร:

  • "r" -- อ่าน (ค่าเริ่มต้น) เปิดไฟล์ที่มีอยู่เพื่ออ่าน

  • "w" -- เขียน สร้างไฟล์ใหม่หรือ ตัดทอน ไฟล์ที่มีอยู่ให้ว่างเปล่า

  • "a" -- เพิ่ม เปิดไฟล์เพื่อเขียนที่ท้ายโดยไม่ตัดทอน

  • "b" ต่อท้ายในโหมดใดก็ได้ข้างต้น ("rb", "wb", "ab") -- binary mode เนื้อหาไฟล์เป็น bytes แทน str

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. ใช้ context manager

รูปแบบข้างต้นทำให้ file handle รั่วไหลหากมีอะไรระหว่าง open() และ close ทำให้ raise วิธีแก้คือคำสั่ง with (ดู context managers):

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

นี่คือรูปแบบมาตรฐาน เขียนแบบนี้ทุกครั้ง

2.27.3. การอ่าน

File objects รองรับหลายวิธีการอ่าน:

  • io.IOBase.read() -- อ่านไฟล์ทั้งหมด (หรือ N bytes) และคืนเป็น string เดียว (หรือ bytes object)

  • io.IOBase.readline() -- อ่านหนึ่งบรรทัด รวมถึง "\n" ท้ายบรรทัด

  • การวนซ้ำไฟล์โดยตรงจะ yield ทีละบรรทัด ใช้หน่วยความจำน้อยกว่าการอ่านไฟล์ทั้งหมดในครั้งเดียวมาก

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip() ลบ newline ท้ายก่อนพิมพ์เพื่อให้ output ไม่มีการเว้นบรรทัดสองเท่า

2.27.4. การเขียน

เปิดไฟล์ในโหมด "w" และใช้ io.IOBase.write():

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() ไม่ เพิ่ม newline แต่เขียน bytes (หรือตัวอักษรในโหมดข้อความ) ที่คุณให้มาตรงๆ

2.27.5. Text vs binary

โหมดข้อความ (ค่าเริ่มต้น "r" / "w" โดยไม่มี "b") ถอดรหัส bytes ที่เข้ามาเป็น str โดยใช้ encoding เริ่มต้น และเข้ารหัส str ที่ออกกลับเป็น bytes ใช้สำหรับ configuration, logs, JSON ซึ่งเป็นข้อมูลที่ เป็น ข้อความ

โหมด binary ("rb" / "wb") ข้ามขั้นตอนการถอดรหัสและคืน bytes ใช้สำหรับรูปภาพ ระเบียนที่แพ็คด้วย struct การจับภาพเครือข่าย ซึ่งเป็นข้อมูลที่ทุก byte สำคัญและไฟล์ไม่สามารถอ่านได้ด้วยมนุษย์

2.27.6. การแสดงรายการและลบไฟล์

โมดูล os เปิดเผยการดำเนินการ filesystem ที่ไม่ได้อยู่บน file object:

  • os.listdir() -- คืนรายชื่อใน directory

  • os.remove() -- ลบไฟล์

  • os.rename() -- เปลี่ยนชื่อไฟล์

  • os.stat() -- metadata ของไฟล์ (ขนาด เวลาแก้ไข ...)

  • os.mkdir() -- สร้าง directory ใหม่

import os

for name in os.listdir("/"):
    print(name)

ดักจับ OSError รอบๆ เหล่านี้เมื่อไฟล์หรือ directory อาจไม่มีอยู่ การดำเนินการเหล่านี้เป็นสถานที่ทั่วไปที่ exceptions เกิดขึ้นในสคริปต์จริง