Đọc file trong python | Laptrinhcanban.com

Đọc file trong python

Hướng dẫn cách xử lý file trong Python. Bạn sẽ biết cách đọc file trong python bằng mode r trong python, với các phương pháp như đọc toàn bộ file trong python hoặc đọc từng dòng file txt trong Python bằng các phương thức như read(), readlines() trong python sau bài học này.

Để đọc file txt trong python, chúng ta có các phương pháp sau:

  • Phương thức read(): Đọc toàn bộ tệp dưới dạng một chuỗi
  • Phương thức readlines(): Đọc toàn bộ tệp dưới dạng list
  • Phương thức readline(): Đọc từng dòng file trong python

Trước khi đọc file trong Python

Để đọc file trong python, trước hết chúng ta cần mở file đó bằng hàm open() hoặc bằng câu lệnh with mà Kiyoshi đã hướng dẫn trong bài Mở và đóng file trong python.

Lưu ý là tùy thuộc vào mục đích của việc đọc file mà mode dùng để mở file cũng sẽ khác nhau, do vậy chúng ta cần hết sức chú ý khi lựa chọn mode khi mở file.

Ở đây, mode đọc file chính là thông tin về những việc cần làm với một file. Các mode có thể dùng để đọc file trong Python như sau:

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
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

Thông thường khi mở để đọc file, chúng ta sẽ sử dụng tới mode r trong hàm open() như sau:

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

Hoặc là sử dụng hàm open với câu lệnh with như sau:

with open('myfile.txt', 'r') as f:
print(type(f))

Tuy nhiên do mặc định của mode trong hàm open() cũng là mode=r, do đó bạn cũng có thể lược bỏ chỉ định của r khi đọc file bằng một trong hai cách này như sau:

f = open('myfile.txt')

with open('myfile2.txt') as f:
print(type(f))

Nếu bạn muốn mở file này với mã ký tự khác với mã ký tự mặc định trên máy tính của mình, hãy chỉ định thêm đối số endcoding như ví dụ sau:

f = open('myfile.txt', 'r', encoding='UTF-8')

Ngoài ra nếu bạn muốn mở file để vừa đọc và vừa ghi nội dung vào file chẳng hạn, hãy mở file bằng một số mode khác, ví dụ như là mode r+, hoặc a+ chẳng hạn.

f = open('myfile.txt',"a+")

with open('myfile2.txt',"r+") as f:
print(type(f))

Trong trường hợp bạn chỉ định sai đường dẫn của file cần mở, hoặc là do file đó không tồn tại, lỗi FileNotFoundError sẽ bị xảy ra:

f = open('./scr/other.txt', 'r')
>> FileNotFoundError: [Errno 2] No such file or directory: './scr/other.txt'

Sau khi mở file thành công thì một object file sẽ được trả về. Chúng ta sẽ sử dụng object file này và thực hiện các thao tác đọc file như dưới đây.

Đọc toàn bộ file trong python dưới dạng chuỗi bằng phương thức read()

Sau khi mở file và thu về object file như trên, chúng ta có thể đọc toàn bộ file đó dưới dạng một chuỗi ký tự bằng cách sử dụng phương thức read() với object file đó. Cú pháp sử dụng sẽ là:

f.read(size)

Trong đó f là object file, và size là đối số xác định số ký tự được đọc ra từ file. Nếu đối số này được lược bỏ, file sẽ được đọc cho đến cuối file (EOF).

Ví dụ chúng ta có file myfile.txt có nội dung là Hello World. Chúng ta sẽ tiến hành đọc toàn bộ file này dưới dạng một chuỗi ký tự như sau:

# Mở file và gán object file vào biến f, với mã ký tự utf-8
f1 = open('myfile.txt', 'r', encoding='UTF-8')

# Đọc toàn bộ file lần 1
data1 = f1.read()
print(data1)
#>> Hello world
f1.close() # Đóng file

# Đọc toàn bộ file lần 2
f2 = open('myfile.txt', 'r', encoding='UTF-8')
data2 = f2.read(1)# Đóng file
print(data2)
#>> H
f2.close()

Bạn cũng có thể làm tương tự với câu lệnh with trong Python như sau:

with open('myfile.txt') as f:
data= f.read()
print(data)
#>> Hello world

Lưu ý là nội dung file chứa trong object file f sẽ bị lấy đi sau mỗi lần sử dụng phương thức read(), do đó nếu bạn muốn sử dụng lại file thì bạn cần phải mở lại file đó như ví dụ trên.

Hãy xem sự khác biệt khi sử dụng cùng một object file trong ví dụ sau đây:

f = open('myfile.txt', 'r', encoding='UTF-8')

data1 = f.read(1)
print(data1)

data2 = f.read()
print(data2)
f.close()

Kết quả:

H
ello World

Bạn có thể thấy, ở lần đọc đầu tiên đã đọc xong ký tự H từ bên trong object file f, nên tại lần đọc thứ 2 từ f thì kêt quả trả về sẽ không chứa ký tự H.

Lưu ý khi đọc file trong python, nếu mã ký tự được sử dụng trong tệp (ví dụ như mã ascii) khác với mã ký tự được chỉ định trong hàm open(), lỗi UnicodeDecodeError sẽ xảy ra khi chúng ta đọc file.

f = open('myfile.txt', 'r', encoding='UTF-8')
data = f.read()
#>> UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 0: invalid start byte

Do đó, hãy chỉ định chính xác mã ký tự dùng để đọc file giống với mã ký tự sử dụng để lưu file đó nhé.

Đọc toàn bộ file trong python dưới dạng list bằng phương thức readlines()

Nội dung đọc bao gồm cả ký tự xuống dòng

Sau khi mở file, chúng ta có thể đọc toàn bộ file đó dưới dạng một list bằng cách sử dụng phương thức readlines() với cú pháp sau đây:

f.readlines()

Khi đó, toàn bộ file sẽ được đọc, sau đó nội dung từng hàng trong file (bao gồm cả ký tự xuống dòng nếu có) sẽ được lấy ra và được thêm vào danh sách như là một phần tử. Và do đó số phần tử trong list tạo ra cũng chính bằng với số hàng có trong file ban đầu.

Ví dụ chúng ta có file myfile.txt có nội dung gồm 3 hàng như sau:

Hello World
How are you
What time is it

Chúng ta sẽ đọc toàn bộ file trên dưới dạng list như sau:

with open('myfile.txt', 'r') as f:
datalist = f.readlines()
print(datalist)
#>> ['Hello World\n', 'How are you\n', 'What time is it']

Bạn có thể thấy một list mới gồm 3 phần tử là có giá trị là nội dung của từng hàng (bao gồm cả ký tự xuống dòng \) trong file đã được tạo ra.

Sau khi đọc nội dung của toàn bộ file dưới dạng list, chúng ta có thể xử lý chúng thông qua các phương thức hoặc hàm xử lý trong list Python. Bạn có thể tìm thấy các cách xử lý list trong python trong chuyên đề List trong python.

Ví dụ, chúng ta có thể in từng dòng trong file ban đầu thông qua việc truy cập vào phần tử trong list như sau:

with open('myfile.txt', 'r') as f:
datalist = f.readlines()
line2 = datalist[1]
print(line2)

Kết quả:

How are you

Lưu ý là do ký tự xuống dòng được bao gồm trong phần tử của list, nên nếu in chúng ra màn hình thì sẽ xuất hiện các dấu xuống dòng giống như ví dụ trên.

Nếu bạn muốn in ra màn hình mà không bị xuống dòng như vậy, hãy tham khảo bài viết in không xuống dòng trong python

Nội dung đọc không bao gồm ký tự xuống dòng

Giống như ở trên, việc ký tự xuống dòng được lấy từ file trong kết quả sẽ có thể kéo theo nhiều nhầm lẫn khi xử lý. Do đó, phần lớn trong các trường hợp khi đọc file trong python dưới dạng list thì chúng ta cần có thêm xử lý để xoá bỏ ký tự xuống dòng không mong muốn này đi.

Và một trong những cách thông dụng nhất, đó chính là sử dụng tới phương thức strip() trong python.

Ví dụ cụ thể:

with open('myfile.txt', 'r') as f:
l_strip = [s.strip() for s in f.readlines()]
print(l_strip)

Kết quả

['Hello World', 'How are you', 'What time is it']

Trong dòng code trên, chúng ta đã sử dụng tới List comprehension trong python để viết code cho gọn. Bạn có thể tìm hiểu thêm về cách viết này tại bài viết List comprehension trong python.

Nếu bạn còn bỡ ngỡ với List comprehension, hãy sử dụng tới cách viết truyền thống sau đây:

with open('myfile.txt', 'r') as f:
datalist = f.readlines ()
l_strip=[]
for s in datalist:
l_strip.append(s.strip())
print(l_strip)
#>> ['Hello World', 'How are you', 'What time is it']

Đọc từng dòng file txt trong Python bằng phương thức readline()

Đọc từng dòng file txt

Nếu bạn không muốn đọc toàn bộ file mà muốn đọc từng dòng file trong Python, hãy sử dụng phương thức readline() với cú pháp sau đây:

f.readline()

Phương thức readline() sẽ đọc từng dòng file cho đến vị trí xuống dòng(xuất hiện ký tự xuống dòng \n), hoặc là tới cuối file (EOF), nếu file chỉ có một dòng duy nhất hoặc dòng đang đọc là dòng cuối cùng. Nếu đọc tới cuối file, một ký tự trống ' ' sẽ được trả về.

Cách đọc từng dòng file txt trong python bằng phương thức readline() như ví dụ sau đây. Chúng ta sẽ sử dụng file myfile.txt với nội dung gồm ba hàng như sau:

Hello World
How are you
What time is it
f = open('myfile.txt', 'r')

data = f.readline()
print (data)
#>> Hello World

f.close()

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

with open('myfile.txt', 'r') as f:
data = f.readline()
print (data)
#>> Hello World

Trong ví dụ trên, do chúng ta chạy readline() một lần nên chỉ có dòng đầu tiên của file đã được đọc.

Đọc từng dòng file txt cho tới cuối file

Phương thức readline() chỉ giúp đọc một dòng trong file một lần duy nhất, do đó nếu muốn đọc từng dòng file txt trong python cho đến cuối file, chúng ta cần tạo ra vòng lặp và đọc lần lượt từng dòng trong file đó bằng readline() như sau:

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

while True:
data = f.readline()
if data == '':
break
print (data)
f.close()

Cách viết trên dựa vào việc nếu readline() đọc tới cuối file thì ký tự trống ' ' sẽ được trả về, do đó chương trình sẽ break và thoát khỏi vòng lặp while tại vị trí cuối cùng của file.

Nếu không dùng tới phương thức readline(), bạn cũng có thể đọc từng dòng file trong python với lệnh For như sau:

with open('myfile.txt', 'r') as f:
for s_line in f:
print(s_line)

Cả hai cách viết đều đưa ra cùng kết quả như sau:

Hello World

How are you

What time is it

Bạn có thể thấy, giống như với phương thức readlines() thì ký tự xuống dòng sẽ bao gồm trong kết quả, do đó khi in ra màn hình sẽ có hai lần được in xuống dòng như ở kết quả của ví dụ ở trên.

Xoá ký tự xuống dòng trong nội dung đọc

Mặc dù khi đọc từng dòng trong file thì kết quả đọc sẽ bao gồm cả ký tự xuống dòng, tuy nhiên chúng ta cũng có thể dễ dàng xóa đi ký tự xuống dòng này bằng cách sử dụng kèm phương thức strip() giống như ví dụ dưới đây:

with open('myfile.txt', 'r') as f:
for s_line in f:
print(s_line.strip())

Hoặc là

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

while True:
data = f.readline()
if data == '':
break
print(data.strip())
f.close()

Cả hai cách viết đều đưa ra cùng kết quả như sau:

Hello World
How are you
What time is it

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách đọc 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.