Mở và đóng file trong python (open, with, close) | Laptrinhcanban.com

Mở và đóng file trong python (open, with, close)

Cùng tìm hiểu về cách mở file và đóng file trong Python. Bạn sẽ học được cách mở một file trong Python bằng hàm open và câu lệnh with, cũng như cách đóng file trong Python bằng phương thức close() sau bài học này.

Chúng ta có 2 phương pháp để mở file trong Python như sau:

  • Mở file bằng hàm open
  • Mở file bằng câu lệnh with

Và chúng ta dùng phương thức close() trong Python để đóng một file, sau khi đã hoàn thành các xử lý với nó.

Mở file trong python bằng hàm open()

Hàm open trong Python

Hàm open() là một hàm cài sẵn có tác dụng mở file trong python. Đây là một hàm không thể thiếu khi chúng ta muốn thao tác xử lý với file trong Python.

Chúng ta sử dụng hàm open() với cú pháp tổng quát sau đây:

open ( filepath, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=Non )

Tuy nhiên thông thường chúng ta sẽ lược bỏ phần lớn đối số và dùng hàm open() với cú pháp rút gọn sau đây:

open ( filepath, mode, encoding=None)

Trong đó:

  • filepath là đường dẫn của file cần mở. Đường dẫn này có thể là đường dẫn tương đối hoặc đường dẫn tuyệt đối
  • mode là chế độ mở file
  • encoding là mã ký tự sử dụng khi mở file.

Nếu file mở thành công, một file object (đối tượng để xử lý file ) với mode được chỉ định sẽ được tạo ra. Nếu mở file không thành công, lỗi OSError sẽ được trả về.

Ví dụ cụ thể, chúng ta có thể mở file myfile.txt bằng nhiều cách rút gọn như sau:

f0 = open('myfile.txt')
f1 = open('myfile.txt', 'r')
f2 = open('myfile.txt', 'w+')
f3 = open('myfile.txt', 'r', encoding='UTF-8')
f4 = open('myfile.txt', 'rb')

Đường dẫn file trong python sử dụng khi mở file

Khi mở một file, chúng ta cần chỉ định đường dẫn file đó. Có hai loại đường dẫn file trong pythonđường dẫn tương đốiđường dẫn tuyệt đối.

  • Đường dẫn tuyệt đối là đường dẫn cố định của file đó được xác định trên hệ điều hành. Ví dụ như D:/data/src/test.txt.

  • Đường dẫn tương đối là đường dẫn thể hiện vị trí của file đó so với vị trí hiện tại của chương trình. Ví dụ hiện tại bạn đang chạy chương trình ở thư mục D:\data, khi đó đường dẫn tương đối của file test.txt ở trên sẽ là src/test.txt.

Khi mở một file trong python, bạn có thể sử dụng cả hai loại đường dẫn ở trên để chỉ định vị trí của file đó trong thư mục máy tính của bạn.

Các mode để mở file trong C

Khi mở file, chúng ta cần chỉ định mode-chế độ mở file. Chúng ta có thể sử dụng một trong các mode trong bảng mode xử lý file python dưới đây:

ModeXử lýChức năng
rMở để đọcChỉ cho phép đọc file
Nếu file không tồn tại thì trả về lỗi
wMở để ghi đèXoá nội dung cũ và ghi đè nội dung mới
Nếu file không tồn tại thì tạo file mới
aMở để ghi chènGhi chèn nội dung mới vào cuối file
Nếu file không tồn tại thì tạo file mới
xTạo mới và ghi fileNếu file đã tồn tại thì xảy ra lỗi
r+Mở để đọc và ghi đèCho phép cả đọc và ghi đè
Nếu file không tồn tại thì trả về lỗi
w+Mở để đọc và ghi đèCho phép cả đọc và ghi đè
Nếu file không tồn tại thì tạo file mới
a+Mở để đọc và ghi chènCho phép cả đọc và ghi chèn
Nếu file không tồn tại thì tạo file mới
bĐọc file binarybinary mode
tĐọc file văn bảntext mode

Về mặc định thì file trong python được mở với mode = t (chế độ văn bản) và được rút gọn phần chỉ định t. Tuy nhiên nếu bạn muốn xử lý file binary (file nhị phân), bạn cần thêm ký tự b vào. Ví dụ như là mode=r+b hay là mode=wb chẳng hạn.

Mã ký tự sử dụng khi mở file

Đối sốencoding được sử dụng để chỉ định mã ký tự sử dụng khi mở file trong python. Lưu ý là chỉ định này chỉ dùng được khi chúng ta đọc file txt trong python mà thôi. Bảng dưới đây là các bảng mã ký tự mà bạn có thể chỉ định khi mở file txt trong python.

ascii
cp932
euc_jp
shift_jis
utf-8 (utf_8)

Trong trường hợp bạn lược bỏ đi đối số endcoding thì python sẽ sử dụng mã ký tự đang được sử dụng trên máy tính của bạn để mở file trong python. Bạn có thể kiểm tra mã ký tự đang được sử dụng trên máy tính của mình bằng cách chạy các dòng code sau đây trên flatform chạy python của mình, ví dụ như Anaconda Prompt:

import locale
locale.getpreferredencoding()

#>>`cp932`

Do máy tính của Kiyoshi đang sử dụng hệ điều hành với ngôn ngữ chính là tiếng Nhật nên mã ký tự mặc định sẽ là cp932 như trên. Còn máy tính của bạn thì sao? Hãy thử và share kết quả ở phần comment cuối bài nhé.

Class của file object trong python

Sau khi mở thành công một file trong python, một file object tương ứng với file đó sẽ được tạo ra. Class của file object này sẽ tùy thuộc vào mode mở file mà bạn đã sử dụng, giống như bảng đối ứng mode và file object sau đây:

ModuleClass của object file
rio.TextIOWrapper
r+io.TextIOWrapper
rbio.BufferedReader
r+bio.BufferedRandom
wio.TextIOWrapper
w+io.TextIOWrapper
wbio.BufferedWriter
w+bio.BufferedRandom
aio.TextIOWrapper
a+io.TextIOWrapper
abio.BufferedWriter
a+bio.BufferedRandom
xio.TextIOWrapper
x+io.TextIOWrapper
xbio.BufferedWriter
x+bio.BufferedRandom

Từ bảng trên chúng ta có thể tổng quát, class của object file trong Chế độ văn bản sẽ là io.TextIOWrapper , trong Chế độ nhị phân sẽ là io.BufferedReader, trong mode viết là io.BufferedReader, và trong mode đọc viết sẽ là io.BufferedRandom.
Tùy thuộc vào class của object file được tạo ra mà chúng ta có thể sử dụng các thuộc tính hay phương thức trong class đó khác nhau.

Mở file trong python bằng câu lệnh with

Ngoài hàm open thì bạn cũng có thể mở file trong python bằng cách sử dụng câu lệnh with kết hợp hàm open với cú pháp sau đây:

with open(filepath, mode, encoding=None) as f:
     lệnh xử lý 1
     lệnh xử lý 2
     ...
     ...

Trong đó open là hàm open() mà Kiyoshi đã giới thiệu ở trên, và f là object file trả về nếu file được mở thành công.
Sau khi mở file, bạn có thể ghi các câu lệnh xử lý file này ở trong khối mà with tạo ra, với các dòng lệnh được viết thụt lùi.

Ví dụ:

```python
with open('myfile.txt', 'r', encoding='UTF-8') as f:
data= f.read()
print(data)

Về class của object file khi được mở bởi câu lệnh with, thì bạn lưu ý là class này luôn là io.TextIOWrapper, như ví dụ sau:

path= "src/test.txt" 
with open(path) as f:
print(type(f))

#<class '_io.TextIOWrapper'>

Sự khác biệt giữa mở file bằng hàm open và bằng câu lệnh with

Chúng ta đều có thể sử dụng hàm open lẫn câu lệnh with để mở file trong C. Việc lựa chọn phương pháp nào thì tuỳ theo sở thích của mỗi lập trình viên, tuy nhiên thì hai phương pháp này cũng có điểm khác biệt, đó chính là trong cách đóng lại file sau khi mở.

Với file được mở bằng hàm open, chúng ta phải đóng lại file đó sau khi đã mở và thao tác xong với file. Tuy nhiên thì đối với file được mở bằng câu lệnh with, chúng ta không cần phải đóng lại file sau khi mở, vì câu lệnh with vốn tự động đóng lại file cho chúng ta rồi.

Xử lý lỗi khi mở file trong Python

Chúng ta có thể sử dụng một trong hai phương pháp mà Kiyoshi đã giới thiệu ở trên để mở một file trong Python, nhưng trong quá trình mở có thể gặp một số lỗi nào đó, dẫn dến việc không phải lúc nào bạn cũng có thể mở file đó thành công.

Sẽ tất nguy hiểm khi thực hiện quá trình thao tác với một tập tin mà không thể mở được, do đó thay vì để chương trình tiếp tục chạy như cũ thì chúng ta cần phải thiết kế các xử lý để chương trình tự xử lý lỗi, và chạy chương trình một cách chính xác.

Nếu không thể mở file chính xác, lỗi OSError sẽ bị trả về. Ứng bạn có thể sử dụng điều này, chúng ta có thể phán đoán khi nào thì đã mở file thất bại, và xử lý lỗi khi cần.

Trong Python, để xử lý lỗi chúng ta hay sử dụng tới lệnh try…catch. Và ứng dụng lệnh này, chúng ta có thể viết chương trình xử lý lỗi khi mở file trong Python như sau:

import sys
try:
outfile=open("sample.txt",'a+')
except PermissionError :
print("\n Error : Cant open file")
input(">>")
sys.exit()

Lưu ý, sys.exit() là hàm dùng để kết thúc cưỡng chế một chương trình Python, và chúng ta cần phải import sys để sử dụng được hàm này.

Đóng file trong python bằng phương thức close()

Sau khi đã xử lý xong file trong chương trình, chúng ta cần phải đóng file đó lại. Việc đóng file sẽ giúp kết thúc phiên làm việc với file, và giải phóng bộ nhớ.

Nếu không đóng file thì file đó vẫn tồn tại trên bộ nhớ, dẫn đến xảy ra các sự cố về bộ nhớ trong chương trình.

Để đóng một file trong Python, chúng ta cần dùng đến phương thức close() với cú pháp sau đây:

f.close()

Trong đó f là object file được tạo ra sau khi mở file.

Ví dụ cụ thể, chúng ta đóng một file sau khi đã mở nó bằng phương thức close() như sau:

f = open('myfile.txt', 'r')
print(type(f))

f.close()

Lưu ý, nếu bạn mở file bằng lệnh with thì file sẽ tự động đóng lại sau khi thực hiện hết các lệnh trong khối tạo ra bởi with, do đó bạn không cần dùng tới lệnh đóng file trong trường hợp này.

Ví dụ, sau khi mở file và thực hiện xong các câu lệnh trong khối with, file sẽ tự đóng lại như sau nên chúng ta không cần đóng file:

with open(path) as f:
print(type(f))

Chương trình mở file và đóng file trong Python

Giả sử chúng ta có một file test.txt có đường dẫn là D:\data\src\test.txt, với nội dung file là Hello World.

Chúng ta tiến hành mở file, thao tác và đóng file lại bằng hàm open() như sau:

path= "src/test.txt" # hoặc path = "D:/data/src/test.txt"

f = open(path)

print(type(f))
# <class '_io.TextIOWrapper'>

data = f.read()
print(data)
# Hello World

f.close()

Bạn cũng có thể làm tương tự bằng lệnh with như sau:

path= "src/test.txt" 
with open(path) as f:
data = f.read()
print(type(f))
# <class '_io.TextIOWrapper'>

print(data)
# Hello World

Sau khi mở file thành công, một file object với tên f đã được tạo ra. Bạn có thể kiểm tra định dạng file object này thuộc class io.TextIOWrapper bằng hàm type. Bạn cũng có thể đọc nội dung của file object rồi gán vào biến và thao tác với biến đó như ví dụ trên.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách mở file và đóng file trong python rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu các kiến thức về Python trong các bài viết sau.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.