Xử lý tệp trong Python

<p style="text-align: justify;">Trong c&aacute;c chủ đề trước ch&uacute;ng ta đ&atilde; l&agrave;m quen với hầu hết tất cả c&aacute;c kh&aacute;i niệm cơ bản trong Python, trong chủ đề n&agrave;y, ch&uacute;ng ta sẽ tiếp tục với một yếu tố quan trọng c&ograve;n lại trong mọi ng&ocirc;n ngữ lập tr&igrave;nh đ&oacute; l&agrave; vấn đề xử l&yacute; đọc ghi tập. B&agrave;i n&agrave;y sẽ bắt đầu với c&aacute;c thao t&aacute;c xử l&yacute; tệp cơ bản trong Python, bao gồm việc mở một v&agrave; đ&oacute;ng File.</p> <h2 style="text-align: justify;">File (Tệp) l&agrave; g&igrave;?</h2> <p style="text-align: justify;">C&aacute;c File, hay c&ograve;n được gọi l&agrave; tệp, được sử dụng để lưu trữ c&aacute;c th&ocirc;ng tin li&ecirc;n quan. Ch&uacute;ng được sử dụng để lưu trữ vĩnh viễn dữ liệu trong bộ nhớ (v&iacute; dụ: đĩa cứng). V&igrave; bộ nhớ RAM rất dễ g&acirc;y mất m&aacute;t dữ liệu khi tắt m&aacute;y t&iacute;nh, do vậy, ch&uacute;ng ta c&oacute; thể sử dụng tệp để sử dụng dữ liệu về sau bằng c&aacute;ch lưu trữ ch&uacute;ng.</p> <p style="text-align: justify;">Khi ch&uacute;ng ta muốn đọc hoặc ghi v&agrave;o một tệp, trước ti&ecirc;n ch&uacute;ng ta cần mở n&oacute;. Sau khi ho&agrave;n tất, n&oacute; cần phải được đ&oacute;ng lại để c&aacute;c t&agrave;i nguy&ecirc;n gắn với tệp được giải ph&oacute;ng.</p> <p style="text-align: justify;">Như vậy, trong Python, c&aacute;c thao t&aacute;c xử l&yacute; File trong Python diễn ra theo thứ tự sau:</p> <ol style="text-align: justify;"> <li>Mở tệp</li> <li>Đọc hoặc ghi tệp</li> <li>Đ&oacute;ng tệp</li> </ol> <h2 style="text-align: justify;">Mở tệp trong Python</h2> <p style="text-align: justify;">Python c&oacute; một h&agrave;m <code class="EnlighterJSRAW" data-enlighter-language="generic">open()</code> đ&atilde; được t&iacute;ch hợp sẵn để mở một tệp. H&agrave;m n&agrave;y trả về một đối tượng tệp, c&ograve;n được gọi l&agrave; handle, đ&acirc;y l&agrave; một đối tượng đặc biệt được sử dụng để đọc hoặc sửa đổi tệp.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>file = open("tek4vn.txt")</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể chỉ định chế độ thao t&aacute;c trong khi mở tệp. Ch&uacute;ng ta c&oacute; thể chỉ định chế độ đọc, ghi hay gh&eacute;p th&ecirc;m dữ liệu v&agrave;o tệp l&agrave; a. Ch&uacute;ng ta cũng c&oacute; thể chỉ định mở tệp ở chế độ văn bản hay chế độ nhị ph&acirc;n.</p> <p style="text-align: justify;">Theo mặc định l&agrave; chế độ đọc ở dạng văn bản. Trong chế độ n&agrave;y, ch&uacute;ng ta sẽ nhận được chuỗi k&yacute; tự khi đọc từ tệp.</p> <p style="text-align: justify;">Mặt kh&aacute;c, chế độ nhị ph&acirc;n sẽ trả về dạng byte v&agrave; đ&acirc;y l&agrave; chế độ được sử dụng khi xử l&yacute; c&aacute;c tệp kh&ocirc;ng phải văn bản như h&igrave;nh ảnh.</p> <table style="border-collapse: collapse; margin-left: auto; margin-right: auto;"> <tbody> <tr> <td style="text-align: center;">Chế độ</td> <td style="text-align: center;">M&ocirc; tả</td> </tr> <tr> <td style="text-align: center;">r</td> <td>Mở tệp để đọc.</td> </tr> <tr> <td style="text-align: center;">w</td> <td>Mở tệp để ghi dữ liệu. Tạo 1 tệp mới nếu tệp kh&ocirc;ng tồn tại.</td> </tr> <tr> <td style="text-align: center;">x</td> <td>Tạo tệp.</td> </tr> <tr> <td style="text-align: center;">a</td> <td>Mở tệp để th&ecirc;m dữ liệu v&agrave;o cuối. Tạo 1 tệp mới nếu kh&ocirc;ng tồn tại.</td> </tr> <tr> <td style="text-align: center;">t</td> <td>Mở tệp ở chế độ dạng văn bản.</td> </tr> <tr> <td style="text-align: center;">b</td> <td>Mở tệp ở chế độ dạng nhị ph&acirc;n.</td> </tr> <tr> <td style="text-align: center;">+</td> <td>Mở tệp để cập nhật.</td> </tr> </tbody> </table> <p style="text-align: justify;">Khi l&agrave;m việc với c&aacute;c tệp ở chế độ văn bản, ta sẽ chỉ định kiểu encoding cho dữ liệu.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>file = open("tek4vn.txt", mode='r', encoding='utf-8')</code></pre> <p style="text-align: justify;">Ở c&acirc;u lệnh n&agrave;y, ch&uacute;ng ta đang thực hiện việc mở tệp c&oacute; t&ecirc;n l&agrave; "tek4vn.txt" với chế độ mode='r' tức l&agrave; mở tệp để đọc, v&agrave; chỉ định kiểu encoding để đọc dữ liệu ra l&agrave; encoding='utf-8'.</p> <h2 style="text-align: justify;">Đ&oacute;ng tệp trong Python</h2> <p style="text-align: justify;">Khi thực hiện xong c&aacute;c thao t&aacute;c tr&ecirc;n tệp, ch&uacute;ng ta cần đ&oacute;ng tệp đ&uacute;ng c&aacute;ch. Việc đ&oacute;ng tệp sẽ giải ph&oacute;ng t&agrave;i nguy&ecirc;n được gắn với tệp. Nếu kh&ocirc;ng đ&oacute;ng tệp ch&uacute;ng ta sẽ gặp vấn đề với c&aacute;c dữ liệu r&aacute;c v&agrave; c&oacute; thể k&eacute;o chậm việc thực thi cũng như tốn nhiều t&agrave;i nguy&ecirc;n để duy tr&igrave; việc mở tệp. Trong Python, ch&uacute;ng ta c&oacute; rất nhiều c&aacute;ch để đ&oacute;ng tệp.</p> <h3 style="text-align: justify;">Sử dụng phương thức close()</h3> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể thực hiện đ&oacute;ng tệp bằng c&aacute;ch sử dụng phương thức <code class="EnlighterJSRAW" data-enlighter-language="generic">close()</code> c&oacute; sẵn trong Python. Điều n&agrave;y kh&aacute; giống trong nhiều ng&ocirc;n ngữ lập tr&igrave;nh kh&aacute;c.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>file = open("tek4vn.txt", encoding = 'utf-8') file.close()</code></pre> <p style="text-align: justify;">Tuy nhi&ecirc;n, phương ph&aacute;p n&agrave;y kh&ocirc;ng ho&agrave;n to&agrave;n an to&agrave;n. Nếu một ngoại lệ xảy ra khi ch&uacute;ng ta đang thực hiện một số thao t&aacute;c với tệp, đoạn m&atilde; sẽ kết th&uacute;c m&agrave; kh&ocirc;ng đ&oacute;ng tệp. Tức l&agrave; vẫn tồn tại phần t&agrave;i nguy&ecirc;n đang xử l&yacute; tệp do chương tr&igrave;nh đ&atilde; gặp ngoại lệ v&agrave; bị kết th&uacute;c cứng. Ch&uacute;ng ta sẽ t&igrave;m hiểu về kh&aacute;i niệm ngoại lệ n&agrave;y trong Chủ đề tiếp theo của Kh&oacute;a học. Ở đ&acirc;y ch&uacute;ng ta sẽ tạm hiểu ngoại lệ tức l&agrave; những lỗi ph&aacute;t sinh bất ngờ khi thực hiện chương tr&igrave;nh.</p> <h3 style="text-align: justify;">Sử dụng khối lệnh xử l&yacute; ngoại lệ try...finally</h3> <p style="text-align: justify;">Một c&aacute;ch an to&agrave;n hơn để đ&oacute;ng tệp đ&oacute; l&agrave; ch&uacute;ng ta sử dụng khối lệnh <code class="EnlighterJSRAW" data-enlighter-language="generic">try...finally</code> ngay khi mở tệp.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>try: file = open("tek4vn.txt", encoding = 'utf-8') finally: file.close()</code></pre> <p style="text-align: justify;">Bằng c&aacute;ch n&agrave;y, ch&uacute;ng ta c&oacute; thể đảm bảo rằng tệp được đ&oacute;ng đ&uacute;ng c&aacute;ch ngay cả khi một ngoại lệ được đưa ra v&agrave; khiến cho luồng thực thi của chương tr&igrave;nh dừng lại.</p> <h3 style="text-align: justify;">Sử dụng c&acirc;u lệnh with</h3> <p style="text-align: justify;">Ngo&agrave;i hai c&aacute;ch tr&ecirc;n, khi mở v&agrave; đ&oacute;ng tệp trong Python th&igrave; c&aacute;ch tốt nhất n&ecirc;n sử dụng l&agrave; c&acirc;u lệnh <code class="EnlighterJSRAW" data-enlighter-language="generic">with</code>. Việc sử dụng with đảm bảo rằng tệp được đ&oacute;ng khi khối b&ecirc;n trong c&acirc;u lệnh with được tho&aacute;t. Ch&uacute;ng ta sẽ kh&ocirc;ng cần gọi phương thức close().</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>with open("tek4vn.txt", encoding = 'utf-8') as file:</code></pre> <p style="text-align: justify;">Như vậy, ch&uacute;ng ta đ&atilde; thực hiện xong việc mở v&agrave; đ&oacute;ng file trong Python. Tiếp theo ch&uacute;ng ta sẽ tiếp tục thực hiện c&aacute;c thao t&aacute;c như đọc ghi tr&ecirc;n file.</p>