Hướng dẫn can python handle real - python có thể xử lý thật không
Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Đọc và ghi các tập tin bằng Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Reading and Writing Files in Python Show
Một trong những nhiệm vụ phổ biến nhất mà bạn có thể làm với Python là đọc và viết tệp. Cho dù nó viết vào một tệp văn bản đơn giản, đọc nhật ký máy chủ phức tạp hoặc thậm chí phân tích dữ liệu byte thô, tất cả các tình huống này đều yêu cầu đọc hoặc viết một tệp. Trong hướng dẫn này, bạn sẽ học:
Hướng dẫn này chủ yếu dành cho người mới bắt đầu đến trung gian Pythonistas, nhưng có một số lời khuyên ở đây mà các lập trình viên tiên tiến hơn cũng có thể đánh giá cao. Tệp là gì?Trước khi chúng ta có thể đi vào cách làm việc với các tệp trong Python, điều quan trọng là phải hiểu chính xác một tệp là gì và cách các hệ điều hành hiện đại xử lý một số khía cạnh của chúng. Tại cốt lõi của nó, một tệp là một tập hợp các byte tiếp giáp được sử dụng để lưu trữ dữ liệu. Dữ liệu này được tổ chức theo một định dạng cụ thể và có thể đơn giản như tệp văn bản hoặc phức tạp như một chương trình có thể thực thi. Cuối cùng, các tệp byte này sau đó được dịch thành nhị phân 5 và 6 để xử lý dễ dàng hơn bởi máy tính.Các tệp trên hầu hết các hệ thống tệp hiện đại bao gồm ba phần chính:
Những gì dữ liệu này thể hiện phụ thuộc vào đặc tả định dạng được sử dụng, thường được biểu thị bằng một phần mở rộng. Ví dụ: một tệp có phần mở rộng 7 rất có thể phù hợp với đặc tả định dạng trao đổi đồ họa. Có hàng trăm, nếu không phải hàng ngàn phần mở rộng tệp ngoài kia. Đối với hướng dẫn này, bạn sẽ chỉ xử lý các phần mở rộng tệp 8 hoặc 9.Đường dẫn tập tinKhi bạn truy cập một tệp trên một hệ điều hành, một đường dẫn tệp được yêu cầu. Đường dẫn tệp là một chuỗi đại diện cho vị trí của một tệp. Nó chia thành ba phần chính:
Ở đây, một ví dụ nhanh chóng. Hãy nói rằng bạn có một tệp nằm trong cấu trúc tệp như thế này:
Hãy nói rằng bạn muốn truy cập vào tệp 3 và vị trí hiện tại của bạn nằm trong cùng thư mục với 4. Để truy cập tệp, bạn cần đi qua thư mục 4 và sau đó là thư mục 6, cuối cùng đến tệp 3. Đường dẫn thư mục là 8. Tên tệp là 9. Phần mở rộng tệp là 7. Vì vậy, đường dẫn đầy đủ là 1.Bây giờ, hãy để nói rằng vị trí hiện tại hoặc thư mục làm việc hiện tại của bạn (CWD) nằm trong thư mục 6 của cấu trúc thư mục ví dụ của chúng tôi. Thay vì đề cập đến 3 theo đường dẫn đầy đủ của 1, tệp có thể được tham chiếu đơn giản bằng tên tệp và tiện ích mở rộng 3.
Nhưng còn 6 thì sao? Làm thế nào bạn sẽ truy cập vào đó mà không cần sử dụng đường dẫn đầy đủ? Bạn có thể sử dụng DOT đôi ký tự đặc biệt ( 7) để di chuyển một thư mục lên. Điều này có nghĩa là 8 sẽ tham chiếu tệp 6 từ thư mục của 6:
DOT đôi ( 7) có thể được xích lại với nhau để vượt qua nhiều thư mục trên thư mục hiện tại. Ví dụ: để truy cập 2 từ thư mục 6, bạn sẽ sử dụng 4.Kết thúc dòngMột vấn đề thường gặp phải khi làm việc với dữ liệu tệp là biểu diễn của một dòng mới hoặc kết thúc dòng. Kết thúc dòng có nguồn gốc từ trở lại trong kỷ nguyên mã Morse, khi một ký hiệu ủng hộ cụ thể được sử dụng để truyền đạt sự kết thúc của việc truyền hoặc kết thúc của một dòng. Sau đó, điều này đã được tiêu chuẩn hóa cho các nhà giao dịch từ xa bởi cả Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) và Hiệp hội Tiêu chuẩn Hoa Kỳ (ASA). ASA tiêu chuẩn nói rằng các kết thúc dòng nên sử dụng trình tự trả lại vận chuyển ( 5 hoặc 6) và các ký tự nguồn cấp dữ liệu dòng ( 7 hoặc 8) ( 9 hoặc 0). Tuy nhiên, tiêu chuẩn ISO cho phép các ký tự 9 hoặc chỉ là ký tự 7.Windows sử dụng các ký tự 9 để chỉ ra một dòng mới, trong khi các phiên bản MAC UNIX và MAC mới hơn chỉ sử dụng ký tự 7. Điều này có thể gây ra một số biến chứng khi bạn xử lý các tệp trên một hệ điều hành khác với nguồn tệp. Ở đây, một ví dụ nhanh chóng. Hãy nói rằng chúng tôi kiểm tra tệp 6 được tạo trên hệ thống Windows:
Đầu ra tương tự này sẽ được giải thích trên một thiết bị UNIX khác nhau:
Điều này có thể làm cho việc lặp lại trên mỗi dòng có vấn đề và bạn có thể cần phải tính đến các tình huống như thế này. Mã hóa ký tựMột vấn đề phổ biến khác mà bạn có thể gặp phải là mã hóa dữ liệu byte. Một mã hóa là một bản dịch từ dữ liệu byte sang các ký tự có thể đọc được của con người. Điều này thường được thực hiện bằng cách gán một giá trị số để thể hiện một ký tự. Hai mã hóa phổ biến nhất là các định dạng ASCII và Unicode. ASCII chỉ có thể lưu trữ 128 ký tự, trong khi Unicode có thể chứa tới 1.114.112 ký tự. ASCII thực sự là một tập hợp con của Unicode (UTF-8), có nghĩa là ASCII và Unicode có chung số lượng với các giá trị ký tự. Điều quan trọng cần lưu ý là việc phân tích một tệp có mã hóa ký tự không chính xác có thể dẫn đến lỗi hoặc trình bày sai về ký tự. Ví dụ: nếu một tệp được tạo bằng mã hóa UTF-8 và bạn cố gắng phân tích nó bằng mã hóa ASCII, nếu có một ký tự nằm ngoài 128 giá trị đó, thì sẽ bị lỗi. Mở và đóng một tập tin trong PythonKhi bạn muốn làm việc với một tệp, điều đầu tiên cần làm là mở nó. Điều này được thực hiện bằng cách gọi chức năng tích hợp 6. 6 có một đối số bắt buộc duy nhất là đường dẫn đến tệp. 6 có một lần trả về duy nhất, đối tượng tệp:
Sau khi bạn mở một tập tin, điều tiếp theo để học là làm thế nào để đóng nó. Điều quan trọng cần nhớ là nó có trách nhiệm đóng tệp. Trong hầu hết các trường hợp, khi chấm dứt ứng dụng hoặc tập lệnh, cuối cùng một tệp sẽ được đóng. Tuy nhiên, không có gì đảm bảo khi chính xác điều đó sẽ xảy ra. Điều này có thể dẫn đến hành vi không mong muốn bao gồm rò rỉ tài nguyên. Nó cũng là một thực tiễn tốt nhất trong Python (Pythonic) để đảm bảo rằng mã của bạn hoạt động theo cách được xác định rõ và giảm bất kỳ hành vi không mong muốn nào. Khi bạn điều khiển một tệp, có hai cách bạn có thể sử dụng để đảm bảo rằng một tệp được đóng đúng, ngay cả khi gặp lỗi. Cách đầu tiên để đóng tệp là sử dụng khối 9:
Nếu bạn không quen thuộc với khối 9 là gì, hãy xem các ngoại lệ của Python: Giới thiệu.Cách thứ hai để đóng tệp là sử dụng câu lệnh 1:
Câu lệnh 1 tự động chăm sóc việc đóng tệp một khi nó rời khỏi khối 1, ngay cả trong trường hợp lỗi. Tôi thực sự khuyên bạn nên sử dụng câu lệnh 1 càng nhiều càng tốt, vì nó cho phép mã sạch hơn và giúp xử lý mọi lỗi bất ngờ dễ dàng hơn cho bạn.Nhiều khả năng, bạn cũng sẽ muốn sử dụng đối số vị trí thứ hai, 5. Đối số này là một chuỗi chứa nhiều ký tự để thể hiện cách bạn muốn mở tệp. Mặc định và phổ biến nhất là 6, đại diện cho việc mở tệp ở chế độ chỉ đọc dưới dạng tệp văn bản:
Các tùy chọn khác cho các chế độ được ghi lại đầy đủ trực tuyến, nhưng các tùy chọn được sử dụng phổ biến nhất là:
Hãy để Lừa quay lại và nói một chút về các đối tượng tệp. Một đối tượng tệp là:
Có ba loại đối tượng tệp khác nhau:
Mỗi loại tệp này được xác định trong mô -đun 3. Ở đây, một bản tóm tắt nhanh chóng về cách mọi thứ xếp hàng.Loại tệp văn bảnTệp văn bản là tệp phổ biến nhất mà bạn sẽ gặp. Dưới đây là một số ví dụ về cách các tệp này được mở:
Với các loại tệp này, 6 sẽ trả về đối tượng tệp 5:
>>> 0Đây là đối tượng tệp mặc định được trả về bởi 6.Các loại tệp nhị phân được đệmMột loại tệp nhị phân được đệm được sử dụng để đọc và viết các tệp nhị phân. Dưới đây là một số ví dụ về cách các tệp này được mở: 1Với các loại tệp này, 6 sẽ trả về đối tượng tệp 8 hoặc 9:>>> 2Đây là đối tượng tệp mặc định được trả về bởi with open('dog_breeds.txt') as reader: # Further file processing goes here 6.Các loại tệp nhị phân được đệm
Với các loại tệp này, 6 sẽ trả về đối tượng tệp 8 hoặc 9:Các loại tệp thô 3Một loại tệp thô là: >>> 4Đây là đối tượng tệp mặc định được trả về bởi with open('dog_breeds.txt') as reader: # Further file processing goes here 6.Các loại tệp nhị phân được đệm
Sử dụng cùng một tệp 6 mà bạn đã sử dụng ở trên, hãy để xem qua một số ví dụ về cách sử dụng các phương pháp này. Ở đây, một ví dụ về cách mở và đọc toàn bộ tệp bằng 12:>>> 5Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python 13:>>> 6Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python 13:>>> 7Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python 13:>>> 8Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python / │ ├── path/ | │ | ├── to/ ← Your current working directory (cwd) is here | │ └── cats.gif ← Accessing this file | │ | └── dog_breeds.txt | └── animals.csv 13:Dưới đây, một ví dụ về cách đọc toàn bộ tệp dưới dạng danh sách bằng phương thức Python 10:>>> 9Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python 13:>>> 0Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python 13:>>> 1Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python 13:Dưới đây, một ví dụ về cách đọc toàn bộ tệp dưới dạng danh sách bằng phương thức Python 10:
Tuy nhiên, các ví dụ trên có thể được đơn giản hóa hơn nữa bằng cách lặp trên chính đối tượng tệp: 2Cách tiếp cận cuối cùng này là Pythonic hơn và có thể nhanh hơn và hiệu quả hơn về bộ nhớ. Do đó, bạn đề nghị bạn sử dụng điều này thay thế.Bây giờ, hãy để Lặn đi vào các tập tin viết. Cũng như đọc tệp, các đối tượng tệp có nhiều phương thức hữu ích để ghi vào tệp: >>> 3Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python 13:Dưới đây, một ví dụ về cách đọc toàn bộ tệp dưới dạng danh sách bằng phương thức Python 10:Ví dụ trên cũng có thể được thực hiện bằng cách sử dụng 15 để tạo danh sách ra khỏi đối tượng tệp:
Đôi khi, bạn có thể cần phải làm việc với các tệp sử dụng chuỗi byte. Điều này được thực hiện bằng cách thêm ký tự 23 vào đối số 5. Tất cả các phương thức tương tự cho đối tượng tệp áp dụng. Tuy nhiên, mỗi phương thức mong đợi và trả về một đối tượng 25 thay thế:>>> 4Dưới đây, một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương pháp Python / │ ├── path/ | │ | ├── to/ ← Your current working directory (cwd) is here | │ └── cats.gif ← Accessing this file | │ | └── dog_breeds.txt | └── animals.csv 13:Dưới đây, một ví dụ về cách đọc toàn bộ tệp dưới dạng danh sách bằng phương thức Python 10:Ví dụ trên cũng có thể được thực hiện bằng cách sử dụng 15 để tạo danh sách ra khỏi đối tượng tệp: 5Lặp lại trên từng dòng trong tệpMột điều phổ biến cần làm trong khi đọc một tệp là lặp lại trên mỗi dòng. Dưới đây, một ví dụ về cách sử dụng phương pháp Python 13 để thực hiện phép lặp đó:/ │ ├── path/ | │ | ├── to/ ← Your current working directory (cwd) is here | │ └── cats.gif ← Accessing this file | │ | └── dog_breeds.txt | └── animals.csv 53Một cách khác, bạn có thể lặp lại trên mỗi dòng trong tệp là sử dụng phương thức Python 10 của đối tượng tệp. Hãy nhớ rằng, 10 Trả về một danh sách trong đó mỗi phần tử trong danh sách đại diện cho một dòng trong tệp:
Cách tiếp cận cuối cùng này là Pythonic hơn và có thể nhanh hơn và hiệu quả hơn về bộ nhớ. Do đó, bạn đề nghị bạn sử dụng điều này thay thế. 6Chạy 57 Sản xuất như sau: 7Tôi đã có thể chạy và nhận trạng thái của tất cả các bài kiểm tra của mình một cách linh hoạt thông qua việc sử dụng thuộc tính đặc biệt của 53.Nối vào một tập tinĐôi khi, bạn có thể muốn nối vào một tệp hoặc bắt đầu viết ở cuối tệp đã có. Điều này dễ dàng được thực hiện bằng cách sử dụng ký tự 59 cho đối số 5: 8Khi bạn kiểm tra lại 6, bạn sẽ thấy rằng phần đầu của tệp không thay đổi và 62 hiện được thêm vào cuối tệp:>>> 9Làm việc với hai tệp cùng một lúcCó những lúc bạn có thể muốn đọc một tệp và ghi vào một tệp khác cùng một lúc. Nếu bạn sử dụng ví dụ được hiển thị khi bạn đang học cách ghi vào một tệp, thì nó thực sự có thể được kết hợp thành các vấn đề sau: 0Tạo trình quản lý bối cảnh của riêng bạnCó thể đến lúc bạn sẽ cần kiểm soát tốt hơn đối tượng tệp bằng cách đặt nó bên trong một lớp tùy chỉnh. Khi bạn làm điều này, sử dụng câu lệnh 1 không còn có thể được sử dụng trừ khi bạn thêm một vài phương pháp ma thuật: 64 và 65. Bằng cách thêm những thứ này, bạn sẽ tạo ra cái mà người ta gọi là người quản lý ngữ cảnh. 66 được gọi khi gọi câu lệnh 1. 68 được gọi khi thoát khỏi khối tuyên bố 1.Dưới đây, một mẫu mà bạn có thể sử dụng để tạo lớp tùy chỉnh của mình: 1Bây giờ bạn đã có lớp tùy chỉnh của mình hiện là người quản lý ngữ cảnh, bạn có thể sử dụng nó tương tự như 6 tích hợp: 2Đây là một ví dụ tốt. Bạn có nhớ hình ảnh Jack Russell dễ thương mà chúng tôi đã có không? Có lẽ bạn muốn mở các tệp 28 khác nhưng không muốn phân tích tệp tiêu đề mỗi lần. Ở đây, một ví dụ về cách làm điều này. Ví dụ này cũng sử dụng trình lặp tùy chỉnh. Nếu bạn không quen thuộc với họ, hãy xem Python Iterators: 3Bây giờ bạn có thể mở các tệp 28 và phân tích đúng chúng bằng cách sử dụng Trình quản lý bối cảnh tùy chỉnh của bạn:>>> 4Làm việc với hai tệp cùng một lúcCó những lúc bạn có thể muốn đọc một tệp và ghi vào một tệp khác cùng một lúc. Nếu bạn sử dụng ví dụ được hiển thị khi bạn đang học cách ghi vào một tệp, thì nó thực sự có thể được kết hợp thành các vấn đề sau:
66 được gọi khi gọi câu lệnh 1. 68 được gọi khi thoát khỏi khối tuyên bố 1.
75: Đọc và viết các tệp WAV (âm thanh)
/ │ ├── path/ | │ | ├── to/ ← Your current working directory (cwd) is here | │ └── cats.gif ← Accessing this file | │ | └── dog_breeds.txt | └── animals.csv 79: Làm việc với kho lưu trữ zip 80: Dễ dàng tạo và phân tích các tệp cấu hình 81: Tạo hoặc đọc các tệp dựa trên XML
87: Đọc và thao tác hình ảnhBạn là một pháp sư tập tin Harry! This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Reading and Writing Files in Python |