Đọc ghi file trong Python hoặc trong bất kỳ ngôn ngữ nào khác là một thao tác thường xuyên được sử dụng trong quá trình làm việc. Bài viết này sẽ hướng dẫn bạn chi tiết cách đọc file trong Python và ghi file trong Python. Ngoài ra, mình cũng sẽ chia sẻ cách đọc ghi cấu trúc từ điển ra file JSON.
Đọc ghi file trong Python
Quá trình đọc ghi file trong Python trải qua 3 bước: Mở file, Đọc hoặc ghi file và cuối cùng là đóng file. Nhưng đầu tiên, chúng ta sẽ xem xét các mode khi làm việc với file trong Python nhé.
Mode truy cập tệp trong Python
Khá giống với các ngôn ngữ khác, việc đọc ghi file trong Python cũng có các mode làm việc tương ứng.
Mode | Giải thích |
Read Only (‘r’) | Mode mặc định khi mở tệp. Ở chế độ này, tệp được mở ở chế độ chỉ được phép đọc dữ liệu và con trỏ tệp bắt đầu ở vị trí đầu tệp. Nếu tệp không tồn tại, sẽ gặp ngoại lệ FileNotFoundError. |
Read & Write (‘r+’) | Mở file cho phép cả đọc và ghi. Vị trí con trỏ tệp ở vị trí đầu của tệp. Nếu tệp không tồn tại, sẽ gặp ngoại lệ FileNotFoundError. |
Write Only (‘w’) | Mở file và chỉ cho phép ghi. Vị trí con trỏ tệp ở vị trí đầu của tệp. Nếu tệp không tồn tại, sẽ tự động tạo mới. Nếu tệp đã tồn tại, dữ liệu cũ sẽ bị ghi đè bằng dữ liệu mới. |
Write & Read (‘w+’) | Mở file cho phép cả đọc và ghi. Vị trí con trỏ tệp ở vị trí đầu của tệp. Nếu tệp không tồn tại, sẽ tự động tạo mới. Nếu tệp đã tồn tại, dữ liệu cũ sẽ bị ghi đè bằng dữ liệu mới. |
Append Only (‘a’) | Mở file cho phép ghi. File sẽ được tạo mới nếu chưa tồn tại. Con trỏ tệp sẽ ở cuối file nên sẽ tiếp tục ghi dữ liệu vào cuối nếu ban đầu đã có dữ liệu. |
Append & Read (‘a+’) | Mở file cho phép ghi và đọc. File sẽ được tạo mới nếu chưa tồn tại. Con trỏ tệp sẽ ở cuối file nên sẽ tiếp tục ghi dữ liệu vào cuối nếu ban đầu đã có dữ liệu. |
Mở file trong Python
Để mở file trong Python, chúng ta không cần phải import thêm thư viện nào cả, chúng ta sẽ sử dụng hàm open()
built-in có cú pháp như sau:
file_object = open(r'đường_dẫn_tới_file', 'mode')
Lưu ý: Ký tự r trước đường dẫn tới file giúp bỏ qua các ký tự đặc biệt của string trong Python. Chẳng hạn, nếu không có ký tự r
này thì t
trong đường dẫn `D:textmyfile.txt` này sẽ bị coi là dấu tab, dẫn tới xảy ra lỗi không mong muốn.
Ví dụ:
# mở file để đọc, mode = 'r' rf = open('data.txt', 'r') # hoặc rf = open('data.txt') # mở file để ghi wf = open('data.txt', 'w') # mở file để ghi vào cuối wf = open('data.txt', 'a')
Đóng file trong Python
Sử dụng hàm close()
để đóng đối tượng tệp khi bạn đã làm việc xong với nó. Hãy luôn nhớ đóng file sau khi làm việc xong nếu không muốn phát sinh các vấn đề không mong muốn.
Ví dụ:
# mở file để đọc, mode = 'r' rf = open('data.txt', 'r') # hoặc rf = open('data.txt') # đóng file rf.close() # mở file để ghi wf = open('data.txt', 'w') # đóng file wf.close() # mở file để ghi vào cuối wf = open('data.txt', 'a') # đóng file wf.close()
[sc_box]
Một cách linh hoạt hơn (nên dùng) khi làm việc với file mà không cần phải lo khi nào đóng file. Hãy sử dụng từ khóa with
như sau:
# Python sẽ tự động đóng file cho bạn with open('/home/user/data.txt', 'r') as fp: # doing smt # tiếp tục các khối lệnh khác ...
[/sc_box]
Đọc file trong Python
Python cung cấp cho bạn 3 cách khác nhau để đọc nội dung từ tập tin. Mình sẽ đi trực tiếp vào ví dụ để các bạn có thể hiểu & áp dụng được ngay
Đọc toàn bộ file ra string
Sử dụng hàm read()
để đọc toàn bộ nội dung file vào 1 biến string.
with open('data.txt') as rf: content = rf.read() print(content) content = content + "nnFrom LTKK with love" print(content)
Kết quả nhận được (cũng chính là nội dung file data.txt
):
Kích thước cố định Cần chỉ rõ kích thước trong khi khai báo Kích thước thay đổi trong quá trình thêm/ xóa phần tử Kích thước tối đa phụ thuộc vào bộ nhớ typedef được dùng để định nghĩa một kiểu dữ liệu trong C. malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc Kích thước cố định Cần chỉ rõ kích thước trong khi khai báo Kích thước thay đổi trong quá trình thêm/ xóa phần tử Kích thước tối đa phụ thuộc vào bộ nhớ typedef được dùng để định nghĩa một kiểu dữ liệu trong C. malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc From LTKK with love
Đọc từng dòng của file
Sử dụng hàm readline()
sẽ trả về 1 dòng nội dung của file. Chúng ta có thể duyệt qua từng dòng nội dung của file như sau:
with open('data.txt') as rf: line = rf.readline() index = 1 while line: print('Line {}: {}'.format(index, line)) index += 1 line = rf.readline()
Kết quả:
Line 1: Kích thước cố định Line 2: Cần chỉ rõ kích thước trong khi khai báo Line 3: Kích thước thay đổi trong quá trình thêm/ xóa phần tử Line 4: Kích thước tối đa phụ thuộc vào bộ nhớ Line 5: typedef được dùng để định nghĩa một kiểu dữ liệu trong C. Line 6: malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new Line 7: sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc
Hàm readline()
sẽ đọc 1 dòng, bao gồm cả ký tự newline (‘n’). Nên khi in ra, mỗi dòng có thể 1 dòng trống ở phía dưới như kết quả ở trên.
Đọc toàn bộ file ra list
Vẫn là đọc toàn bộ file nhưng hàm readlines()
sẽ trả về một list tương ứng mỗi dòng dữ liệu là 1 phần tử của list.
with open('data.txt') as rf: lines = rf.readlines() for idx, line in enumerate(lines): print(idx, line)
Kết quả:
0 Kích thước cố định 1 Cần chỉ rõ kích thước trong khi khai báo 2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử 3 Kích thước tối đa phụ thuộc vào bộ nhớ 4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C. 5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new 6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc
Lưu ý: Bạn có thể dùng hàm strip()
để xóa khoảng trắng thừa ở đầu & cuối string. Và ký tự newline ở cuối mỗi string cũng được coi là 1 khoảng trắng thừa.
Ghi file trong Python
Để ghi file trong Python, chúng ta có thể sử dụng hàm write()
để ghi 1 biến string, hoặc dùng `writelines()` để ghi 1 list các chuỗi string.
texts = [ "0 Kích thước cố định", "1 Cần chỉ rõ kích thước trong khi khai báo", "2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử", "3 Kích thước tối đa phụ thuộc vào bộ nhớ", "4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.", "5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new", "6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc" ] with open('data.txt', 'w') as wf: for text in texts: wf.write(text + 'n')
Hoặc:
texts = [ "0 Kích thước cố định", "1 Cần chỉ rõ kích thước trong khi khai báo", "2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử", "3 Kích thước tối đa phụ thuộc vào bộ nhớ", "4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.", "5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new", "6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc" ] with open('data.txt', 'w') as wf: wf.writelines(texts)
[sc_alert]Hàm wirtelines()
không tự động chèn thêm n
vào cuối mỗi dòng. Nên nếu chạy code trên thì các dòng sẽ ghi liền nhau thành 1 dòng duy nhất.[/sc_alert]
0 Kích thước cố định1 Cần chỉ rõ kích thước trong khi khai báo2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử3 Kích thước tối đa phụ thuộc vào bộ nhớ4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc
Ghi dữ liệu vào cuối file
Chúng ta chỉ cần đổi mode từ w
sang a
là được. Xem ví dụ:
texts = [ "0 Kích thước cố định", "1 Cần chỉ rõ kích thước trong khi khai báo", "2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử", "3 Kích thước tối đa phụ thuộc vào bộ nhớ", "4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.", "5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new", "6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc" ] with open('data.txt', 'w') as wf: for text in texts: wf.write(text + 'n') with open('data.txt') as wr: print("Number of line:", len(wr.readlines())) # Ghi file vào cuối with open('data.txt', 'a') as wf: wf.write('=> From LTKK with love') with open('data.txt') as wr: texts = wr.readlines() print("Number of line:", len(texts)) print(texts)
Kết quả:
Number of line: 7 Number of line: 8 ['0 Kích thước cố địnhn', '1 Cần chỉ rõ kích thước trong khi khai báon', '2 Kích thước thay đổi trong quá trình thêm/ xóa phần tửn', '3 Kích thước tối đa phụ thuộc vào bộ nhớn', '4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.n', '5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng newn', '6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm mallocn', '=> From LTKK with love']
[sc_]
Đọc ghi JSON từ file
Trong phần này, chúng ta sẽ làm việc với tệp tin JSON sử dụng ngôn ngữ Python. Giả sử chúng ta có file JSON như sau:
Cách đọc file JSON
import json with open('customer.json') as wr: customers = json.load(wr) for customer in customers: print(customer, type(customer))
Kết quả:
{'id': 1, 'email': '[email protected]', 'first': 'Torrey', 'last': 'Veum', 'company': 'Hilll, Mayert and Wolf', 'created_at': '2014-12-25T04:06:27.981Z', 'country': 'Switzerland'} <class 'dict'> {'id': 2, 'email': '[email protected]', 'first': 'Micah', 'last': 'Sanford', 'company': 'Stokes-Reichel', 'created_at': '2014-07-03T16:08:17.044Z', 'country': "Democratic People's Republic of Korea"} <class 'dict'>
Ghi dữ liệu từ điển ra file JSON
import json customers = [ { "id": 1, "email": "[email protected]", "first": "Torrey", "last": "Veum", "company": "Hilll, Mayert and Wolf", "created_at": "2014-12-25T04:06:27.981Z", "country": "Switzerland" }, { "id": 2, "email": "[email protected]", "first": "Micah", "last": "Sanford", "company": "Stokes-Reichel", "created_at": "2014-07-03T16:08:17.044Z", "country": "Democratic People's Republic of Korea" } ] with open('customer.json', 'w') as wr: json.dump(customers, wr)
Lưu ý:
- Với dữ liệu tiếng Việt, hàm
dump()
vàdumps()
sẽ đưa toàn bộ về bảng mã ASCII. Do đó, nếu bạn muốn đọc được file JSON khi mở bằng Editor, thêm optionensure_ascii = False
. - Nếu muốn làm đẹp file JSON, hãy thêm option `indent=2` vào hàm `dump()` nhé. Trong đó, 2 số lượng dấu cách (space) dùng để format tệp tin.
import json customers = [ { "id": 1, "email": "[email protected]", "first": "Hiếu", "last": "Nguyễn Văn", "company": "Zalo", "created_at": "2014-12-25T04:06:27.981Z", "country": "Việt Nam" }, { "id": 2, "email": "[email protected]", "first": "Micah", "last": "Sanford", "company": "Stokes-Reichel", "created_at": "2014-07-03T16:08:17.044Z", "country": "Democratic People's Republic of Korea" } ] with open('customer.json', 'w') as wr: json.dump(customers, wr, ensure_ascii=False, indent=2)
Kết quả:
Như vậy, bài viết đã trình bày các nội dung cần thiết đến bạn đọc về nội dung đọc ghi file trong Python. Với những kiến thức căn bản này, bạn hoàn toàn có thể sử dụng đáp ứng yêu cầu trong công việc rồi. Chúc các bạn học tập tốt!
Tham gia nhóm Lập Trình Không Khó nhé: https://www.facebook.com/groups/1023125804557712/
Để lại một bình luận