Python

File I/O in Python 3

TẠO MỚI VÀ MỞ FILE

Để tạo một file mới hoặc mở một file đã có, chúng ta sử dụng function open()

fileObject = open(“filename”, “mode”)

Trong đó:

  • filename – String chứa tên của file cần tạo/mở;
  • mode – String chứa chế độ hoạt động, gồm:
    1. ‘r’ – cho phép đọc file ở dạng ký tự, mặc định;
    2. ‘w’ – cho phép ghi đè lên file ở dạng ký tự, luôn tạo file mới dù cho file đó đã tồn tại;
    3. ‘a’ – cho phép ghi thêm dữ liệu ở dạng ký tự vào cuối file đã có từ trước;
    4. ‘r+’, ‘w+’, ‘a+’ – cho phép đọc và ghi đè/ghi thêm vào file ở dạng ký tự;
    5. ‘rb’, ‘wb’, ‘ab’, ‘rb+’, ‘wb+’, ‘ab+’ – tương tự các mode ở trên nhưng được thực hiện trên raw bytes thay vì các ký tự.
  • fileObject – file instance được trả về.

Quan trọng: sau khi hoàn tất việc đọc/ghi file, chúng ta cần đóng file đó lại với method:

fileObject.close()


ĐỌC FILE

Để đọc nội dung của một file đã được mở, Python cung cấp khá nhiều method khác nhau, như: read(), read(N), readline(), readlines(). Trong phần này chúng ta sẽ tìm hiểu về method read().

fileObject.read()

  • Nếu fileObject được mở ở chế độ đọc ký tự, thì method read() sẽ đọc nội dung của file ở dạng String;
  • Nếu fileObject được mở ở chế độ đọc raw bytes, thì method read() sẽ đọc nội dung của file ở dạng bytes.

Example 1:
Input file: data.txt;
Nội dung của file: codelungtung.com
Code:

# đọc file ở dạng ký tự
file = open("data.txt", 'r')
data = file.read()
print("data type: {}\ndata: {}".format(type(data), data))
print("characters:", *list(data), sep=' ', end='\n\n')
file.close()

# đọc file ở dạng raw bytes
file = open("data.txt", 'rb')
data = file.read()
print("data type: {}\ndata: {}".format(type(data), data))
print("bytes:", *list(data), sep=' ')
file.close()

Output:
data type: <class ‘str’>
data: codelungtung.com

characters: c o d e l u n g t u n g . c o m

data type: <class ‘bytes’>
data: b’codelungtung.com’

bytes: 99 111 100 101 108 117 110 103 116 117 110 103 46 99 111 109

Giải thích:
– Ở phần “#đọc file ở dạng ký tự”, dữ liệu đọc từ file được chuyển về kiểu String, khi in từng phần tử của data, chúng ta nhận được các ký tự riêng biệt;
– Ở phần “#đọc file ở dạng raw bytes”, dữ liệu đọc từ file được chuyển về kiểu bytes, với ký tự b’…’ đặc trưng, khi in từng phần tử của data, chúng ta nhận được các số nguyên tương ứng với mã ASCII;


 GHI FILE

Để ghi dữ liệu vào một file đã mở, chúng ta sử dụng method write():

fileObject.write()

  • Nếu fileObject được mở ở chế độ ghi ký tự, thì method write() sẽ nhận tham số ở kiểu String;
  • Nếu fileObject được mở ở chế độ ghi raw bytes, thì method write() sẽ nhận tham số ở kiểu bytes;

Example 2:
Code:

data1 = "codelungtung.com\n"
data2 = "Embedded Programming & Computer Vision"
file = open("data.txt", "w")
file.write(data1)
file.close()

file = open("data.txt", "ab")
file.write(data2.encode())
file.close()

file = open("data.txt", "r")
print(file.read())
file.close()

Output:
Mở file data.txt với notepad:
codelungtung.com
Embedded Programming & Computer Vision

Giải thích:
– Dòng 3: mở file để ghi dữ liệu ở dạng ký tự;
– Dòng 7: mở file để thêm dữ liệu ở dạng raw bytes;
– Dòng 8: khi cần ghi file ở dạng raw bytes, chúng ta cần chuyển dữ liệu từ kiểu String về kiểu bytes.


FILE CONTEXT MANAGER

Khi làm việc xong với file, chúng ta cần đóng tất cả các file đã mở để tránh memory leak. Tuy nhiên, khi số lượng file đã mở khá lớn, việc gọi các method close() sẽ khá dài dòng. Để hỗ trợ lập trình viên trong quản lý các file đã mở, Python cung cấp File Context Manager:

with open(“filename”, “mode”) as alias:
# something here

Example 3:

data1 = "codelungtung.com\n"
data2 = "Embedded Programming & Computer Vision"
with open("data.txt", "w") as file:
    file.write(data1)

with open("data.txt", "ab") as file:
    file.write(data2.encode())

with open("data.txt", "r") as file:
    print(file.read())

Giải thích:
– Example 3 là phiên bản mới của example 2 với File Context Manager.


Reference:
[1] Python Pocket Reference – Files

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s