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()-- คืนรายชื่อใน directoryos.remove()-- ลบไฟล์os.rename()-- เปลี่ยนชื่อไฟล์os.stat()-- metadata ของไฟล์ (ขนาด เวลาแก้ไข ...)os.mkdir()-- สร้าง directory ใหม่
import os
for name in os.listdir("/"):
print(name)
ดักจับ OSError รอบๆ เหล่านี้เมื่อไฟล์หรือ directory อาจไม่มีอยู่ การดำเนินการเหล่านี้เป็นสถานที่ทั่วไปที่ exceptions เกิดขึ้นในสคริปต์จริง