Xử lý tệp bằng Python không yêu cầu nhập mô-đun. Đối tượng Tệp cung cấp các hàm và phương thức cơ bản cần thiết để thao tác với tệp theo mặc định. Python cung cấp cho bạn những cách dễ dàng để thao tác với các tệp này. Để đọc dữ liệu từ một tệp, trước hết, bạn cần mở nó ở chế độ đọc. Sau đó, bạn có thể gọi bất kỳ phương thức nào mà Python cung cấp để đọc từ tệp
Thực tế, có một số cách để đọc tệp văn bản trong Python. Hàm đọc chứa các phương thức khác nhau, read[],readline[] và readlines[]
- đã đọc[[số]]. Trả về số ký tự đã chỉ định từ tệp. nếu bỏ qua nó sẽ đọc toàn bộ nội dung của tập tin
- dòng đọc []. Trả về dòng tiếp theo của tệp
- đường đọc []. Đọc tất cả các dòng dưới dạng danh sách các chuỗi trong tệp
Đọc toàn bộ nội dung của tập tin cùng một lúc
đầu ra
Chỉ đọc một dòng
đầu ra
Đọc dữ liệu sử dụng kích thước
đầu ra
Đọc tất cả các dòng dưới dạng một mảng
đầu ra
Đọc từng dòng tệp
Nếu bạn muốn đọc tất cả các dòng từ một tệp trong bộ nhớ hiệu quả hơn, bạn có thể sử dụng phương pháp lặp lại
Cho đến nay trong khóa học này, chúng tôi đã sử dụng các biến để lưu trữ dữ liệu. Vấn đề với phương pháp này là ngay sau khi chương trình kết thúc, dữ liệu của chúng tôi sẽ bị mất. Một cách để lưu trữ dữ liệu vĩnh viễn là đặt nó vào một tệp. Chương này thảo luận về cách chúng ta có thể lưu trữ dữ liệu trong tệp cũng như đọc dữ liệu từ tệp
Trong Python, Xử lý tệp bao gồm ba bước sau
- Mở tập tin
- xử lý tập tin tôi. e thực hiện thao tác đọc hoặc ghi
- Đóng tệp
Các loại tệp
Có hai loại tập tin
Tệp có nội dung mà chương trình soạn thảo văn bản có thể xem được gọi là tệp văn bản. Tệp văn bản chỉ đơn giản là một chuỗi ký tự ASCII hoặc Unicode. Các chương trình Python, mã nguồn HTML là một số ví dụ về tệp văn bản
Một tệp nhị phân lưu trữ dữ liệu theo cách giống như được lưu trữ trong bộ nhớ. Các tệp mp3, tệp hình ảnh, tài liệu từ là một số ví dụ về tệp nhị phân. Bạn không thể đọc tệp nhị phân bằng trình soạn thảo văn bản
Trong bài học này, chúng ta sẽ thảo luận về cách làm việc với cả hai loại tệp
Hãy bắt đầu
Mở một tệp
Trước khi bạn thực hiện bất kỳ thao tác nào trên một tệp, bạn phải mở nó. Python cung cấp một hàm có tên là
f = open["C:\\Users\\tom\\documents\\README.md", "w"]2 để mở tệp. Cú pháp của nó là
fileobject = open[filename, mode]
f = open["C:\\Users\\tom\\documents\\README.md", "w"]3 là tên hoặc đường dẫn của tệp
f = open["C:\\Users\\tom\\documents\\README.md", "w"]4 là một chuỗi xác định thao tác loại mà bạn muốn thực hiện trên tệp [i. e đọc, viết, chắp thêm, v.v.]. Bảng sau đây liệt kê các chế độ khác nhau có sẵn cho bạn
Chế độ Mô tả
f = open["C:\\Users\\tom\\documents\\README.md", "w"]5Mở tệp để đọc. Nếu tệp chưa tồn tại, bạn sẽ gặp lỗi
f = open["C:\\Users\\tom\\documents\\README.md", "w"]6.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]7Mở tệp để viết. Trong chế độ này, nếu tệp được chỉ định không tồn tại, nó sẽ được tạo. Nếu tệp tồn tại, thì dữ liệu của nó sẽ bị hủy.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]8Mở tệp ở chế độ nối thêm. Nếu tệp không tồn tại, chế độ này sẽ tạo tệp. Nếu tệp đã tồn tại thì nó sẽ thêm dữ liệu mới vào cuối tệp thay vì hủy dữ liệu như chế độ
f = open["C:\\Users\\tom\\documents\\README.md", "w"]7 thực hiện
Chúng tôi cũng có thể chỉ định loại tệp [i. tệp văn bản điện tử hoặc tệp nhị phân. ] chúng tôi muốn làm việc với chuỗi
f = open["C:\\Users\\tom\\documents\\README.md", "w"]4 bằng cách nối thêm
fileobject = open[filename, mode]01 cho tệp văn bản và
fileobject = open[filename, mode]02 cho tệp nhị phân. Nhưng vì chế độ văn bản là chế độ mặc định nên nó thường bị bỏ qua khi mở tệp ở chế độ văn bản
Khi thành công,
fileobject = open[filename, mode]03 trả về một đối tượng tệp được liên kết với
f = open["C:\\Users\\tom\\documents\\README.md", "w"]3 được chỉ định trong khi gọi nó
Dưới đây là một số ví dụ về cách mở tệp
ví dụ 1
fileobject = open[filename, mode]4
Câu lệnh này mở tệp văn bản
fileobject = open[filename, mode]05 để đọc. Vì chế độ văn bản là mặc định, câu lệnh trên cũng có thể được viết là
fileobject = open[filename, mode]6
ví dụ 2
Câu lệnh này mở tệp văn bản ở chế độ ghi
ví dụ 3
Câu lệnh này mở tệp nhị phân ở chế độ ghi
Ví dụ 4
Câu lệnh này mở tệp nhị phân ở chế độ chắp thêm
Thay vì sử dụng đường dẫn tệp tương đối, chúng tôi cũng có thể sử dụng đường dẫn tệp tuyệt đối. Ví dụ
fileobject = open[filename, mode]7
Câu lệnh này sẽ mở tệp văn bản
fileobject = open[filename, mode]06 nằm trong thư mục
fileobject = open[filename, mode]07 ở chế độ ghi
Trong Windows, hãy nhớ thoát dấu gạch chéo ngược trong khi sử dụng tên đường dẫn tuyệt đối, nếu không, bạn sẽ gặp lỗi. Ví dụ
f = open["C:\\Users\\tom\\documents\\README.md", "w"]
Chúng ta cũng có thể sử dụng một thứ gọi là "chuỗi thô" bằng cách chỉ định ký tự
fileobject = open[filename, mode]08 ở phía trước chuỗi như sau
fileobject = open[filename, mode]0
Ký tự
fileobject = open[filename, mode]08 khiến Python coi mọi ký tự trong chuỗi là ký tự chữ
Đóng tệp
Khi chúng ta làm việc xong với tệp hoặc chúng ta muốn mở tệp ở một số chế độ khác, chúng ta nên đóng tệp bằng phương thức
f = open["C:\\Users\\tom\\documents\\README.md", "w"]40 của đối tượng tệp như sau
Đóng tệp sẽ giải phóng tài nguyên hệ thống có giá trị. Trong trường hợp bạn quên đóng tệp, Python sẽ tự động đóng tệp khi chương trình kết thúc hoặc đối tượng tệp không còn được tham chiếu trong chương trình. Tuy nhiên, nếu chương trình của bạn lớn và bạn đang đọc hoặc ghi nhiều tệp có thể chiếm một lượng tài nguyên đáng kể trên hệ thống. Nếu bạn tiếp tục mở các tệp mới một cách bất cẩn, bạn có thể hết tài nguyên. Vì vậy, hãy là một lập trình viên giỏi và đóng tệp ngay khi bạn hoàn thành nó
TextIOWlớp rapper
Đối tượng tệp được trả về bởi hàm
fileobject = open[filename, mode]03 là một đối tượng kiểu
f = open["C:\\Users\\tom\\documents\\README.md", "w"]42. Lớp
f = open["C:\\Users\\tom\\documents\\README.md", "w"]42 cung cấp các phương thức và thuộc tính giúp chúng ta đọc hoặc ghi dữ liệu vào và ra khỏi tệp. Bảng sau liệt kê một số phương thức thường dùng của lớp
f = open["C:\\Users\\tom\\documents\\README.md", "w"]42
MethodDescription
f = open["C:\\Users\\tom\\documents\\README.md", "w"]45Đọc số ký tự được chỉ định từ tệp và trả về chúng dưới dạng chuỗi. Nếu
f = open["C:\\Users\\tom\\documents\\README.md", "w"]46 bị bỏ qua thì nó sẽ đọc toàn bộ tệp.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47Đọc một dòng và trả về dưới dạng một chuỗi.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]48Đọc nội dung của một tệp theo từng dòng và trả về chúng dưới dạng danh sách các chuỗi.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]49Ghi đối số chuỗi vào tệp và trả về số ký tự được ghi vào tệp.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]40Di chuyển con trỏ tệp đến phần bù đã cho từ gốc.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]41Trả về vị trí hiện tại của con trỏ tệp.
f = open["C:\\Users\\tom\\documents\\README.md", "w"]40Đóng tệp
Ghi dữ liệu vào tệp văn bản
Chương trình sau minh họa cách ghi dữ liệu vào tệp
python 101/Chương-18/write_to_file. py
f = open["C:\\Users\\tom\\documents\\README.md", "w"]4
Trong dòng 1, chúng tôi đang sử dụng phương pháp
fileobject = open[filename, mode]03 để mở tệp văn bản ở chế độ ghi. Nếu tệp
f = open["C:\\Users\\tom\\documents\\README.md", "w"]44 không tồn tại, phương thức
fileobject = open[filename, mode]03 sẽ tạo tệp. Nếu tệp đã tồn tại, thì dữ liệu của nó sẽ bị ghi đè. Chạy chương trình rồi mở tệp
f = open["C:\\Users\\tom\\documents\\README.md", "w"]44. Nó sẽ giống như thế này
python101/Chương-18/readme. md
f = open["C:\\Users\\tom\\documents\\README.md", "w"]4
Chúng ta hãy xem kỹ cách phương thức
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 ghi dữ liệu vào tệp
Tất cả các hoạt động đọc và ghi trong một tệp bắt đầu tại con trỏ tệp. Con trỏ tệp là gì? . Con trỏ này tự động di chuyển sau mỗi thao tác đọc hoặc ghi
Khi mở tệp con trỏ tệp trỏ về đầu tệp. Hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 bắt đầu ghi ở vị trí tệp hiện tại và sau đó tăng con trỏ tệp. Ví dụ, hình dưới đây cho thấy vị trí của con trỏ tệp sau mỗi thao tác ghi
Lưu ý rằng không giống như hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]49, phương thức
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 không tự động in ký tự xuống dòng [
f = open["C:\\Users\\tom\\documents\\README.md", "w"]71] ở cuối chuỗi. Chúng ta cũng có thể sử dụng hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]49 để ghi dữ liệu vào tệp. Chúng ta hãy xem xét kỹ hơn chữ ký của
f = open["C:\\Users\\tom\\documents\\README.md", "w"]49 bằng cách sử dụng hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]74
f = open["C:\\Users\\tom\\documents\\README.md", "w"]7
f = open["C:\\Users\\tom\\documents\\README.md", "w"]2
Lưu ý tham số thứ tư trong chữ ký hàm i. e
f = open["C:\\Users\\tom\\documents\\README.md", "w"]75. Theo mặc định,
f = open["C:\\Users\\tom\\documents\\README.md", "w"]75 trỏ đến đầu ra tiêu chuẩn có nghĩa là nó sẽ in dữ liệu ra màn hình. Để xuất dữ liệu ra tệp, chỉ cần chỉ định đối tượng tệp. Chương trình sau sử dụng hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]49 thay vì
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 để ghi dữ liệu vào tệp
python 101/Chương-18/ghi dữ liệu bằng print_function. py
fileobject = open[filename, mode]40
Chương trình này tạo ra kết quả giống như trước đây, điểm khác biệt duy nhất là, trong trường hợp này, ký tự xuống dòng [
f = open["C:\\Users\\tom\\documents\\README.md", "w"]71] được tự động thêm vào bởi hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]49
Đọc dữ liệu từ tệp văn bản
Để đọc một tập tin, bạn phải mở nó ở chế độ
f = open["C:\\Users\\tom\\documents\\README.md", "w"]5. Ngoài ra, bạn cũng nên đảm bảo rằng tệp bạn muốn đọc đã tồn tại vì ở chế độ
f = open["C:\\Users\\tom\\documents\\README.md", "w"]5, hàm
fileobject = open[filename, mode]03 đưa ra lỗi
f = open["C:\\Users\\tom\\documents\\README.md", "w"]6 nếu không thể tìm thấy tệp
Để kiểm tra xem một tệp có tồn tại hay không, chúng ta có thể sử dụng hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]25 từ mô-đun
f = open["C:\\Users\\tom\\documents\\README.md", "w"]26. Cú pháp của
f = open["C:\\Users\\tom\\documents\\README.md", "w"]25 là
Nếu tìm thấy tệp tại đường dẫn đã cho
f = open["C:\\Users\\tom\\documents\\README.md", "w"]25 trả về
f = open["C:\\Users\\tom\\documents\\README.md", "w"]29. Nếu không thì
fileobject = open[filename, mode]400. Phiên trình bao sau đây minh họa hoạt động của hàm
f = open["C:\\Users\\tom\\documents\\README.md", "w"]25
fileobject = open[filename, mode]41
Các chương trình sau minh họa cách đọc tệp bằng cách sử dụng hàm
fileobject = open[filename, mode]402,
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 và
f = open["C:\\Users\\tom\\documents\\README.md", "w"]48
ví dụ 1. Đọc dữ liệu cùng một lúc bằng phương pháp
fileobject = open[filename, mode]402
python 101/Chương-18/bản trình diễn phương pháp đọc. py
fileobject = open[filename, mode]42
đầu ra
f = open["C:\\Users\\tom\\documents\\README.md", "w"]4
ví dụ 2. Đọc dữ liệu theo khối bằng phương pháp
fileobject = open[filename, mode]402
python 101/Chương-18/đọc theo khối. py
fileobject = open[filename, mode]44
đầu ra
fileobject = open[filename, mode]45
Khi tệp được mở ở chế độ đọc, con trỏ tệp chỉ vào đầu tệp
Sau khi đọc 4 ký tự đầu tiên, con trỏ tệp ở vị trí
fileobject = open[filename, mode]407
Sau khi đọc 10 ký tự tiếp theo, con trỏ tệp ở ký tự
fileobject = open[filename, mode]408
Cuộc gọi thứ ba đến
fileobject = open[filename, mode]402 đọc các ký tự còn lại trong tệp và trả về chúng dưới dạng chuỗi. Lúc này, con trỏ vị trí tệp trỏ đến cuối tệp. Do đó, mọi lệnh gọi tiếp theo tới phương thức
fileobject = open[filename, mode]402 đều trả về một chuỗi rỗng
ví dụ 3. Sử dụng
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 để đọc dữ liệu từ tệp
bản trình diễn phương thức python 101/Chương-18/readline. py
fileobject = open[filename, mode]46
fileobject = open[filename, mode]47
đầu ra
fileobject = open[filename, mode]48
Thông thường khi mở tệp, con trỏ tệp chỉ vào đầu tệp
Cuộc gọi đầu tiên đến phương thức
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 di chuyển con trỏ tệp đến đầu dòng tiếp theo
Hàm
fileobject = open[filename, mode]402 sau đó đọc hai ký tự từ tệp sẽ di chuyển con trỏ tệp tới ký tự
fileobject = open[filename, mode]414
Ở dòng 10,
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 lại được gọi nhưng lần này nó bắt đầu đọc từ ký tự
fileobject = open[filename, mode]414 đến cuối dòng [kể cả ký tự xuống dòng]
Ở dòng 13,
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 được gọi lại để đọc dòng cuối cùng. Lúc này, con trỏ vị trí tệp nằm ở cuối tệp. Đó là lý do tại sao lệnh gọi
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 ở dòng 16 trả về một chuỗi rỗng [
fileobject = open[filename, mode]419]
Ví dụ 4. Sử dụng
f = open["C:\\Users\\tom\\documents\\README.md", "w"]48 để đọc dữ liệu từ tệp
bản trình diễn phương thức python 101/Chương-18/readlines. py
fileobject = open[filename, mode]49
đầu ra
fileobject = open[filename, mode]60
Đọc các tệp lớn
Các phương pháp
fileobject = open[filename, mode]402 và
f = open["C:\\Users\\tom\\documents\\README.md", "w"]48 hoạt động tốt với các tệp nhỏ. Nhưng nếu tệp của bạn có hàng nghìn hoặc hàng triệu dòng trong đó thì sao? . Một cách tiếp cận tốt hơn là sử dụng các vòng lặp và đọc dữ liệu tệp theo từng phần nhỏ. Ví dụ
python 101/Chương-18/đọc tệp demo1 lớn. py
fileobject = open[filename, mode]61
fileobject = open[filename, mode]62
đầu ra
f = open["C:\\Users\\tom\\documents\\README.md", "w"]4
Ở đây chúng tôi đang sử dụng một vòng lặp vô hạn để lặp lại nội dung của tệp. Ngay khi kết thúc tệp, phương thức
fileobject = open[filename, mode]402 trả về một chuỗi rỗng [
fileobject = open[filename, mode]419], nếu điều kiện ở dòng 12, đánh giá là đúng và câu lệnh
fileobject = open[filename, mode]427 khiến vòng lặp kết thúc
Python cũng cho phép chúng ta sử dụng vòng lặp for để lặp qua tệp dữ liệu bằng đối tượng tệp như sau
python101/Chương-18/reading_large_files_using_for_loop. py
fileobject = open[filename, mode]64
đầu ra
f = open["C:\\Users\\tom\\documents\\README.md", "w"]4
Gắn thêm dữ liệu vào tệp văn bản
Chúng ta có thể sử dụng chế độ
f = open["C:\\Users\\tom\\documents\\README.md", "w"]8 để nối thêm dữ liệu vào cuối tệp. Chương trình sau minh họa cách thêm dữ liệu vào cuối tệp
python101/Chương-18/append_data. py
fileobject = open[filename, mode]66
fileobject = open[filename, mode]67
đầu ra
fileobject = open[filename, mode]68
fileobject = open[filename, mode]69
Làm việc với các tệp bằng câu lệnh with
Python cũng cung cấp một lối tắt đẹp để xử lý tệp bằng cách sử dụng câu lệnh
fileobject = open[filename, mode]429. Sau đây là dạng chung của câu lệnh
fileobject = open[filename, mode]429 khi được sử dụng với tệp
fileobject = open[filename, mode]70
Điều tốt nhất về lối tắt này là nó tự động đóng tệp mà không yêu cầu bất kỳ thao tác nào từ phía bạn. Các câu lệnh bên trong phần thân của câu lệnh with phải được thụt lề bằng nhau nếu không bạn sẽ gặp lỗi. Phạm vi của biến
fileobject = open[filename, mode]431 chỉ giới hạn trong phần thân của câu lệnh
fileobject = open[filename, mode]429. Nếu bạn cố gọi phương thức
fileobject = open[filename, mode]402 hoặc
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47 trên nó bên ngoài khối, bạn sẽ gặp lỗi
Các ví dụ sau đây cho thấy cách chúng ta có thể sử dụng câu lệnh
fileobject = open[filename, mode]429 để đọc và ghi dữ liệu vào và từ tệp
ví dụ 1. Đọc từng dòng dữ liệu bằng vòng lặp for
python 101/Chương-18/có câu lệnh. py
fileobject = open[filename, mode]71
đầu ra
fileobject = open[filename, mode]72
ví dụ 2. Đọc tất cả dữ liệu cùng một lúc bằng phương pháp
fileobject = open[filename, mode]402
python101/Chương-18/with_statement2. py
fileobject = open[filename, mode]73
đầu ra
fileobject = open[filename, mode]72
ví dụ 3. Đọc một tệp lớn trong các khối nhỏ
python 101/Chương-18/với câu lệnh 3. py
fileobject = open[filename, mode]75
fileobject = open[filename, mode]76
đầu ra
fileobject = open[filename, mode]72
Ví dụ 4. Ghi dữ liệu vào tệp bằng phương thức
f = open["C:\\Users\\tom\\documents\\README.md", "w"]47
python101/Chương-18/with_statement4. py
fileobject = open[filename, mode]78
Đọc và ghi dữ liệu nhị phân
Chương trình sau sao chép dữ liệu nhị phân từ tệp nguồn [
fileobject = open[filename, mode]438] sang tệp đích [
fileobject = open[filename, mode]439]