Python ghi vào tập tin từng dòng
Giải pháp cho điều này là một chút khó khăn ở đây. hãy bắt đầu với cách tiếp cận cơ bản và sau đó chúng ta sẽ thảo luận về nhược điểm trong đó và xem cách cải thiện nó, Show
cách tiếp cận cơ bản
Chà, cách tiếp cận này hoạt động tốt nếu tệp của chúng tôi đã tồn tại và đã có một số dữ liệu trong đó. Nhưng nếu tệp không tồn tại hoặc tệp trống thì cách tiếp cận này sẽ thất bại vì nội dung của tệp sẽ như thế này, …………………… Dòng mới được thêm vào Đầu tiên nó viết một dòng trống và sau đó viết dòng của chúng tôi. Nhưng trong trường hợp này, chỉ cần thêm một dòng là được, chúng ta không cần viết '\n' trước đó Vì vậy, cách tiếp cận cuối cùng của chúng ta sẽ như thế này,
Giải pháp này sẽ hoạt động tốt trong cả hai trường hợp. Hãy sử dụng giải pháp này để thêm một dòng mới vào cuối tệp Một trong những tác vụ phổ biến nhất mà bạn có thể thực hiện với Python là đọc và ghi tệp. Cho dù đó là ghi vào tệp văn bản đơn giản, đọc nhật ký máy chủ phức tạp hay 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 ghi 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 Pythonistas từ sơ cấp đến trung cấp, nhưng có một số mẹo ở đây mà các lập trình viên cao cấp hơn cũng có thể đánh giá cao Tiền thưởng miễn phí. Nhấp vào đây để nhận Bảng cheat Python miễn phí của chúng tôi, trang này cho bạn biết kiến thức cơ bản về Python 3, như làm việc với các kiểu dữ liệu, từ điển, danh sách và hàm Python Lấy bài kiểm tra. Kiểm tra kiến thức của bạn với bài kiểm tra tương tác “Đọc và ghi tệp bằng Python” của chúng tôi. Sau khi hoàn thành, bạn sẽ nhận được điểm số để có thể theo dõi quá trình học tập của mình theo thời gian Lấy bài kiểm tra " Tập tin là gì?Trước khi chúng ta có thể tìm hiểu 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 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 Về cốt lõi, một tệp là một tập hợp các byte liền kề được sử dụng để lưu trữ dữ liệu. Dữ liệu này được sắp xếp theo một định dạng cụ thể và có thể là bất kỳ thứ gì đơn giản như tệp văn bản hoặc phức tạp như chương trình thực thi. Cuối cùng, các tệp byte này sau đó được dịch thành mã nhị phân 5 và 6 để máy tính xử lý dễ dàng hơnCá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
Dữ liệu này thể hiện điều gì tùy thuộc vào đặc tả định dạng được sử dụng, thường được biểu thị bằng phần mở rộng. Ví dụ: một tệp có phần mở rộng là 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 muốn nói là hàng nghì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 9Loại bỏ các quảng cáoĐường dẫn tệpKhi bạn truy cập một tệp trên hệ điều hành, cần có đường dẫn tệp. Đường dẫn tệp là một chuỗi đại diện cho vị trí của tệp. Nó được chia thành ba phần chính
Đây là một ví dụ nhanh. Giả sử bạn có một tệp nằm trong cấu trúc tệp như thế này ________số 8 Giả sử bạn muốn truy cập 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 rồi đến 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à 71Bây giờ, giả sử 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ì tham chiếu đến 3 bằng đường dẫn đầy đủ của 71, tệp có thể được tham chiếu đơn giản bằng tên tệp và phần mở rộng 3 2Nhưng còn 76 thì sao? . Điều này có nghĩa là 78 sẽ tham chiếu tệp 76 từ thư mục của 6 8Dấu chấm đôi ( 77) có thể được nối với nhau để duyệt qua nhiều thư mục phía trên thư mục hiện tại. Ví dụ: để truy cập 02 từ thư mục 6, bạn sẽ sử dụng 04kết thúc dòngMột vấn đề thường gặp 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ừ thời Mã Morse, khi một dấu hiệu cụ thể được sử dụng để thông báo kết thúc truyền hoặc kết thúc dòng Sau đó, điều này đã được 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) chuẩn hóa cho máy in từ xa. Tiêu chuẩn ASA quy định rằng các kết thúc dòng phải sử dụng chuỗi các ký tự Trả về vận chuyển ( 05 hoặc 06) và Nguồn cấp dữ liệu theo dòng ( 07 hoặc 08) ( 09 hoặc 80). Tuy nhiên, tiêu chuẩn ISO cho phép cả ký tự 09 hoặc chỉ ký tự 07Windows sử dụng các ký tự 09 để biểu thị một dòng mới, trong khi Unix và các phiên bản Mac mới hơn chỉ sử dụng ký tự 07. Điều này có thể gây ra một số rắc rối khi bạn đang xử lý tệp trên một hệ điều hành khác với nguồn của tệp. Đây là một ví dụ nhanh. Giả sử chúng ta kiểm tra tệp 76 được tạo trên hệ thống Windows
Đầu ra tương tự này sẽ được diễn giải khác nhau trên thiết bị Unix
Điều này có thể làm cho việc lặp lại trên mỗi dòng trở nên khó khăn và bạn có thể cần 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ã hóa là bản dịch từ dữ liệu byte sang 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ố để đại diện cho một ký tự. Hai bảng mã phổ biến nhất là Đị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 chia sẻ cùng giá trị số thành ký tự. Điều quan trọng cần lưu ý là việc phân tích 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 ký tự. Ví dụ: nếu một tệp được tạo bằng mã hóa UTF-8 và bạn cố phân tích cú pháp tệp đó bằng mã hóa ASCII, nếu có một ký tự nằm ngoài 128 giá trị đó thì sẽ xảy ra lỗi Loại bỏ các quảng cáoMở và đóng tệp bằng PythonKhi muốn làm việc với một tệp, việc đầu tiên cần làm là mở tệp đó. Điều này được thực hiện bằng cách gọi hàm tích hợp sẵn 86. 86 có một đối số bắt buộc duy nhất là đường dẫn đến tệp. 86 có một lần trả về, đối tượng tệp 7Sau khi bạn mở một tệp, điều tiếp theo cần tìm hiểu là cách đóng tệp đó Cảnh báo. Bạn phải luôn đảm bảo rằng tệp đang mở được đóng đúng cách. Để tìm hiểu lý do tại sao, hãy xem Tại sao việc đóng tệp trong Python lại quan trọng? Điều quan trọng cần nhớ là bạ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, tệp sẽ bị đóng cuối cùng. Tuy nhiên, không có gì đảm bảo chính xác khi nào đ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. Đây cũng là một cách thực hành 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 mọi hành vi không mong muốn Khi bạn đang thao tác với một tệp, có hai cách bạn có thể sử dụng để đảm bảo rằng tệp được đóng đúng cách, ngay cả khi gặp lỗi. Cách đầu tiên để đóng tệp là sử dụng khối 89 0Nếu bạn không biết khối 89 là gì, hãy xem Python Exceptions. Một lời giới thiệuCách thứ hai để đóng tệp là sử dụng câu lệnh 31 8Câu lệnh 31 tự động đóng tệp sau khi nó rời khỏi khối 31, ngay cả trong trường hợp có lỗi. Tôi thực sự khuyên bạn nên sử dụng câu lệnh 31 càng nhiều càng tốt, vì nó cho phép mã sạch hơn và giúp bạn xử lý mọi lỗi không mong muốn dễ dàng hơnRất có thể, bạn cũng sẽ muốn sử dụng đối số vị trí thứ hai, 35. Đố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à 36, đại diện cho việc mở tệp ở chế độ chỉ đọc dưới dạng tệp văn bản 3Các tùy chọn khác cho các chế độ được ghi lại đầy đủ trực tuyến, nhưng những tùy chọn được sử dụng phổ biến nhất là những tùy chọn sau Ý nghĩa ký tự 36Mở để đọc (mặc định) 38Mở để ghi, cắt ngắn (ghi đè) tệp trước 39 hoặc 40Mở ở chế độ nhị phân (đọc/ghi bằng dữ liệu byte)Hãy 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 tin 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 43. Dưới đây là tóm tắt nhanh về cách mọi thứ sắp xếpLoại bỏ các quảng cáoCác 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ở 4Với các loại tệp này, 86 sẽ trả về một đối tượng tệp 45>>> 20Đây là đối tượng tệp mặc định được trả về bởi 86Các loại tệp nhị phân được đệmLoại tệp nhị phân được đệm được sử dụng để đọc và ghi 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ở 21Với các loại tệp này, 86 sẽ trả về đối tượng tệp 48 hoặc 49>>> 22Các loại tệp thôMột loại tệp thô là
Do đó nó thường không được sử dụng Đây là một ví dụ về cách các tệp này được mở 23Với các loại tệp này, 86 sẽ trả về đối tượng tệp 201>>> 24Đọc và ghi tệp đã mởKhi bạn đã mở một tệp, bạn sẽ muốn đọc hoặc ghi vào tệp. Trước hết, hãy đọc một tập tin. Có nhiều phương thức có thể được gọi trên một đối tượng tệp để giúp bạn giải quyết MethodWhat It Does 202Điều này đọc từ tệp dựa trên số lượng byte 203. Nếu không có đối số nào được chuyển hoặc 204 hoặc 205 được chuyển, thì toàn bộ tệp sẽ được đọc. 206Điều này đọc tối đa 203 số ký tự từ dòng. Điều này tiếp tục đến cuối dòng và sau đó quấn lại. Nếu không có đối số nào được chuyển hoặc 204 hoặc 205 được chuyển, thì toàn bộ dòng (hoặc phần còn lại của dòng) được đọc. 210Điều này đọc các dòng còn lại từ đối tượng tệp và trả về chúng dưới dạng danh sáchSử dụng cùng một tệp 76 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 thức này. Đây là một ví dụ về cách mở và đọc toàn bộ tệp bằng cách sử dụng 212>>> 25Đây là một ví dụ về cách đọc 5 byte của một dòng mỗi lần bằng phương thức Python 213>>> 26Đây là 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 210>>> 27Ví dụ trên cũng có thể được thực hiện bằng cách sử dụng 215 để tạo danh sách ngoài đối tượng tệp>>> 28Loại bỏ các quảng cáoLặp lại từng dòng trong tệpMột điều phổ biến cần làm trong khi đọc tệp là lặp lại từng dòng. Đây là một ví dụ về cách sử dụng phương pháp Python 213 để thực hiện phép lặp đó>>> 29Một cách khác để bạn có thể lặp lại từng dòng trong tệp là sử dụng phương thức Python 210 của đối tượng tệp. Hãy nhớ rằng, 210 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>>> 80Tuy 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 lại trên chính đối tượng tệp >>> 81Cách tiếp cận cuối cùng này mang tính Pythonic hơn và có thể nhanh hơn và hiệu quả hơn về bộ nhớ. Do đó, bạn nên sử dụng cái này để thay thế Ghi chú. Một số ví dụ trên có chứa 219. 220 là để ngăn Python thêm một dòng mới bổ sung vào văn bản đang được in và chỉ in những gì đang được đọc từ tệpBây giờ hãy đi sâu vào việc ghi tệp. Đối với việc đọ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 MethodWhat It Does 221This ghi chuỗi vào tệp. 222Điều này ghi trình tự vào tệp. Không có kết thúc dòng nào được thêm vào mỗi mục trình tự. Tùy thuộc vào bạn để thêm (các) kết thúc dòng thích hợpĐây là một ví dụ nhanh về việc sử dụng 223 và 224 82Làm việc với byteĐô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ự 225 vào đối số 35. Tất cả các phương pháp tương tự cho đối tượng tệp được áp dụng. Tuy nhiên, thay vào đó, mỗi phương thức đều mong đợi và trả về một đối tượng 227>>> 83Mở tệp văn bản bằng cờ 228 không thú vị lắm. Giả sử chúng ta có bức ảnh dễ thương này về Jack Russell Terrier ( 229)Hình ảnh. CC BY 3. 0 (https. //Commons sáng tạo. org/giấy phép/bởi/3. 0)], từ Wikimedia CommonsBạn thực sự có thể mở tệp đó bằng Python và kiểm tra nội dung. Vì định dạng tệp 230 được xác định rõ, tiêu đề của tệp là 8 byte được chia nhỏ như thế nàyValueInterpretation 231Một số "ma thuật" để chỉ ra rằng đây là phần đầu của một ____2232____2233 232 trong ASCII 235A kết thúc dòng kiểu DOS 80 237A ký tự EOF kiểu DOS 238A kết thúc dòng kiểu Unix 08Chắc chắn rồi, khi bạn mở tệp và đọc từng byte này, bạn có thể thấy rằng đây thực sự là tệp tiêu đề 230>>> 84Loại bỏ các quảng cáoMột ví dụ đầy đủ. Pug\r\n Jack Russell Terrier\r\n English Springer Spaniel\r\n German Shepherd\r\n Staffordshire Bull Terrier\r\n Cavalier King Charles Spaniel\r\n Golden Retriever\r\n West Highland White Terrier\r\n Boxer\r\n Border Terrier\r\n 241Hãy mang toàn bộ nội dung này về nhà và xem một ví dụ đầy đủ về cách đọc và ghi vào một tệp. Sau đây là một công cụ tương tự như 242 sẽ chuyển đổi một tệp chứa kết thúc dòng của 80 thành 08Công cụ này được chia thành ba phần chính. Đầu tiên là 245, chuyển đổi một chuỗi từ kết thúc dòng 80 thành 08. Thứ hai là 248, chuyển đổi một chuỗi chứa 80 ký tự thành 08. 248 cuộc gọi 245 nội bộ. Cuối cùng, có khối 253, khối này chỉ được gọi khi tệp được thực thi dưới dạng tập lệnh. Hãy nghĩ về nó như hàm 254 được tìm thấy trong các ngôn ngữ lập trình khác 85Các mẹo và thủ thuậtBây giờ bạn đã nắm vững kiến thức cơ bản về đọc và ghi tệp, dưới đây là một số mẹo và thủ thuật giúp bạn phát triển kỹ năng của mình Pug\r\n Jack Russell Terrier\r\n English Springer Spaniel\r\n German Shepherd\r\n Staffordshire Bull Terrier\r\n Cavalier King Charles Spaniel\r\n Golden Retriever\r\n West Highland White Terrier\r\n Boxer\r\n Border Terrier\r\n 255Thuộc tính 255 là thuộc tính đặc biệt của module, tương tự như 257. Nó là
Ghi chú. Để lặp lại, 255 trả về đường dẫn liên quan đến nơi tập lệnh Python ban đầu được gọi. Nếu bạn cần đường dẫn hệ thống đầy đủ, bạn có thể sử dụng 259 để lấy thư mục làm việc hiện tại của mã thực thi của bạnĐây là một ví dụ thực tế. Ở một trong những công việc trước đây của mình, tôi đã thực hiện nhiều thử nghiệm cho một thiết bị phần cứng. Mỗi bài kiểm tra được viết bằng tập lệnh Python với tên tệp tập lệnh kiểm tra được sử dụng làm tiêu đề. Các tập lệnh này sau đó sẽ được thực thi và có thể in trạng thái của chúng bằng thuộc tính đặc biệt 255. Đây là một cấu trúc thư mục ví dụ 86Đang chạy 261 tạo ra như sau 87Tô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 255Thêm vào một tập tinĐôi khi, bạn có thể muốn nối thêm vào tệp hoặc bắt đầu viết ở cuối tệp đã điền. Điều này được thực hiện dễ dàng bằng cách sử dụng ký tự 263 cho đối số 35 88Khi bạn kiểm tra lại 76, bạn sẽ thấy rằng phần đầu của tệp không thay đổi và 266 hiện được thêm vào cuối tệp>>> 89Loại bỏ các quảng cáoLàm việc với hai tệp cùng một lúcĐôi khi 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, nó thực sự có thể được kết hợp thành như sau 0Tạo trình quản lý bối cảnh của riêng bạnCó thể đến lúc bạn 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, việc sử dụng câu lệnh 31 không còn có thể được sử dụng trừ khi bạn thêm một vài phương thức kỳ diệu. 268 và 269. Bằng cách thêm những thứ này, bạn sẽ tạo ra cái được gọi là trình quản lý ngữ cảnh 270 được gọi khi gọi câu lệnh 31. 272 được gọi khi thoát khỏi khối câu lệnh 31Đây là 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 hiện là trình quản lý ngữ cảnh, bạn có thể sử dụng nó tương tự như lớp tích hợp sẵn 86 2Đây là một ví dụ tốt. Bạn có nhớ hình ảnh Jack Russell dễ thương mà chúng ta có không? . Đây là một ví dụ về cách làm điều này. Ví dụ này cũng sử dụng trình vòng lặp tùy chỉnh. Nếu bạn không quen thuộc với chúng, hãy xem Python Iterators 3Giờ đây, bạn có thể mở các tệp 230 và phân tích cú pháp đúng cách bằng trình quản lý ngữ cảnh tùy chỉnh của mình>>> 4Đừng phát minh lại con rắnMột số tình huống phổ biến mà bạn có thể gặp phải khi làm việc với tệp. Hầu hết các trường hợp này có thể được xử lý bằng các mô-đun khác. Hai loại tệp phổ biến mà bạn có thể cần phải làm việc là 9 và 278. Real Python đã tập hợp một số bài viết tuyệt vời về cách xử lý những
Ngoài ra, có các thư viện tích hợp sẵn mà bạn có thể sử dụng để giúp bạn
Có rất nhiều hơn nữa ngoài kia. Ngoài ra, thậm chí còn có nhiều công cụ của bên thứ ba hơn trên PyPI. Một số cái phổ biến như sau
Bạn là một thuật sĩ tập tin HarryBạn làm được rồi. Bây giờ bạn đã biết cách làm việc với các tệp bằng Python, bao gồm một số kỹ thuật nâng cao. Làm việc với các tệp trong Python giờ đây sẽ dễ dàng hơn bao giờ hết và là một cảm giác bổ ích khi bạn bắt đầu làm việc đó Trong hướng dẫn này, bạn đã học
Nếu bạn có bất kỳ câu hỏi nào, hãy đánh chúng tôi trong phần bình luận Lấy bài kiểm tra. Kiểm tra kiến thức của bạn với bài kiểm tra tương tác “Đọc và ghi tệp bằng Python” của chúng tôi. Sau khi hoàn thành, bạn sẽ nhận được điểm số để có thể theo dõi quá trình học tập của mình theo thời gian Lấy bài kiểm tra " Đánh dấu là đã hoàn thành Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Đọc và ghi tệp bằng Python 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về James Mertz James là một nhà phát triển Python đam mê tại Phòng thí nghiệm Động cơ phản lực của NASA, người cũng viết bài cho Real Python » Thông tin thêm về JamesMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren David Joanna Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bậc thầy Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi |