Chuyển đến nội dung chính

Nhập và ghi tệp văn bản trong Python

Bài viết này trình bày các cách khác nhau để nhập tệp văn bản vào Python bằng Python, NumPy và các phương thức tích hợp của Python. Bài viết cũng đề cập cách chuyển đổi chúng thành danh sách.
· 6 phút đọc

Khám phá cùng AI

Chạy và chỉnh sửa mã từ hướng dẫn trực tuyến này

Chạy mã

Hướng dẫn này trình bày cách đọc các tệp văn bản trong Python. Đây là bước đầu tiên quan trọng cho mọi dự án liên quan đến dữ liệu văn bản, đặc biệt là Xử lý Ngôn ngữ Tự nhiên (“NLP”). Có một số điểm tinh tế và lỗi thường gặp khi nhập tệp văn bản vào Python, khiến các nhà khoa học dữ liệu thường phải rời xa các gói quen thuộc như pandas để xử lý dữ liệu văn bản hiệu quả hơn.

Để tận dụng tối đa bài viết này, bạn nên có kiến thức cơ bản về Python, đặc biệt là hiểu các kiểu dữ liệu như sự khác nhau giữa chuỗi (string), số nguyên (integer) và danh sách (list). Hiểu biết về pandas và dataframe là gì cũng sẽ hữu ích. 

Nếu bạn muốn tìm hiểu về việc nhập dữ liệu từ tệp .csv, nội dung này có trong Hướng dẫn pandas read csv(): Nhập dữ liệu. Để biết thêm về việc nhập từ tệp JSON và pickle (.pkl), hãy xem Hướng dẫn Nhập dữ liệu vào pandas. Nếu bạn quan tâm đến việc thu thập dữ liệu từ các trang HTML, bạn có thể tham khảo Web Scraping bằng Python (và Beautiful Soup). Ngoài ra, bạn có thể bắt đầu học trực tiếp trên DataCamp với khóa học tương tác Giới thiệu về Nhập dữ liệu trong Python, chương đầu miễn phí.

Tệp văn bản

Trong hướng dẫn này, chúng ta sẽ dùng một tệp văn bản đơn giản là phần sao chép đoạn đầu tiên của trang Wikipedia về Xử lý Ngôn ngữ Tự nhiên. Tệp này được lưu với tên nlp_wiki.txt. Nội dung như sau:

"Natural language processing (NLP) is an interdisciplinary subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human language, in particular how to program computers to process and analyze large amounts of natural language data. The goal is a computer capable of "understanding" the contents of documents, including the contextual nuances of the language within them. The technology can then accurately extract information and insights contained in the documents as well as categorize and organize the documents themselves. Challenges in natural language processing frequently involve speech recognition, natural-language understanding, and natural-language generation."

Nhập dữ liệu văn bản trong Python

Nhập dữ liệu bằng hàm read_table() của pandas

Hàm read_table() của pandas được thiết kế để đọc các tệp văn bản phân tách (ví dụ: một bảng tính được lưu dưới dạng tệp văn bản, với dấu phẩy ngăn cách các cột) vào một dataframe. Tệp văn bản của chúng ta không được phân tách. Nó chỉ là văn bản được sao chép. Tuy vậy, dùng pandas vẫn hữu ích để nhanh chóng xem nội dung vì cú pháp của hàm này tương tự read_csv(), vốn quen thuộc với hầu hết nhà khoa học dữ liệu.

Đoạn mã dưới đây có thể dùng để đọc tệp văn bản bằng pandas.

pd.read_table('nlp_wiki.txt', header=None, delimiter=None)

Đầu ra:

image1.png

Chúng ta truyền tên tệp văn bản và hai đối số cho hàm read_table(). 

  • header=None cho pandas biết rằng hàng đầu tiên là văn bản, không phải tiêu đề. 
  • delimiter=None cho pandas biết không tách các dòng ở đâu cả (trừ ký tự xuống dòng), nên sẽ có một cột với mỗi dòng là một hàng.

Trong tình huống này, DataFrame không phải lúc nào cũng lý tưởng. Các đoạn văn bị tách thành từng dòng (pandas dùng ký tự xuống dòng để làm điều này), và chúng ta không xem được toàn bộ đầu ra. Một lựa chọn khác là gọi phương thức .to_list() cho cột.

pd.read_table('nlp_wiki.txt', header=None, delimiter=None)[0].to_list()

Đầu ra:

image2.png

Điều này trả về một danh sách có thể truy cập như một danh sách Python thông thường. Nó cũng in ra toàn bộ văn bản.

Tùy chỉnh việc nhập với read_table()

Hàm read_table() có rất nhiều đối số từ khóa tùy chọn, bạn có thể đọc trong tài liệu chính thức. Dưới đây là một vài cái hữu ích nhất:

skiprows=n

image3.png

Bỏ qua n hàng đầu tiên. Trong ví dụ của chúng ta, ta đã bỏ qua hàng đầu.

nrows=n

image4.png

Giữ lại n hàng đầu tiên. Trong ví dụ, chúng ta giữ lại hàng đầu tiên.

skip_blank_lines= True  

pandas sẽ bỏ qua các giá trị NaN thay vì trả về một hàng trống.

Nhập dữ liệu văn bản với loadtxt() của NumPy

loadtxt() của NumPy được thiết kế để đọc các mảng số từ tệp văn bản; tuy nhiên, nó cũng có thể được dùng để đọc các dòng văn bản. Điều này thuận tiện nếu bạn dùng NumPy cho phần còn lại của phân tích, vì đầu ra là một mảng NumPy.

np.loadtxt('nlp_wiki.txt', dtype="str", delimiter="\0")

Đầu ra:

image5.png

Tương tự ví dụ với pandas, chúng ta truyền đối số delimiter để ngăn các dòng bị tách. Trong trường hợp này, delimiter phải là một ký tự đơn (dùng None sẽ có hành vi khác), nên ta dùng ký tự "kết thúc null", \0. Vì ký tự này không thể xuất hiện giữa một chuỗi, dùng nó có nghĩa là "không dùng dấu phân tách".

Chúng ta cũng truyền dtype="str" để cho NumPy biết kiểu dữ liệu của mảng kết quả. Ở đây, chúng ta dùng “str” để trả về chuỗi. Cách này cũng có thể chuyển thành danh sách bằng hàm .tolist().

Nhập tệp văn bản với hàm tích hợp open() của Python

Có thể đạt được độ linh hoạt tối đa bằng cách dùng chức năng tích hợp sẵn của Python. Cách này ít thân thiện với người dùng và chủ yếu phục vụ kỹ thuật phần mềm. Các giải pháp bằng pandas hoặc NumPy thường là đủ cho phân tích dữ liệu.

Để dùng open(), bạn cũng cần một context manager, đó là từ khóa with. Nó chỉ phân bổ tài nguyên máy tính của bạn trong khi đoạn mã thụt đầu dòng bên dưới with đang chạy. Ở đây, chúng ta mở tệp, lặp và lưu vào bộ nhớ trong biến lines, rồi đóng tệp.

Vòng lặp for ở đây dùng list comprehension, mỗi dòng là một dòng theo cách hiểu của hàm open(), trong trường hợp này là ký tự xuống dòng (\n).

Khối mã này cũng dùng hàm strip(), hàm này loại bỏ khoảng trắng thừa trước và sau mỗi đối tượng (hoặc dòng).

with open(filename) as file:
    lines = [line.strip() for line in file]

Đầu ra:

image7.png

Như bạn thấy, đầu ra là một danh sách đơn, trong đó mỗi phần tử là một đoạn văn. Khác với ví dụ pandas và NumPy, chúng ta có ba đối tượng ở đây vì văn bản gốc có hai ký tự xuống dòng giữa các đoạn.

Ghi tệp văn bản trong Python 

Sau khi đã tìm hiểu cách nhập tệp văn bản trong Python, hãy xem cách ghi tệp văn bản. Ghi tệp có nghĩa là lưu tệp văn bản từ Python vào máy của bạn. Điều này đặc biệt hữu ích khi bạn đã xử lý tệp văn bản trong Python và muốn lưu kết quả. 

Ghi tệp văn bản bằng phương thức tích hợp write()

Bạn có thể ghi tệp văn bản trong Python bằng phương thức tích hợp write(). Nó cũng yêu cầu dùng open(), và bạn cần một context manager là từ khóa with. Hãy minh họa bằng ví dụ:

with open("new_nlp_wiki.txt", "w") as file:
  file.write("New wiki entry: ChatGPT")

Trong ví dụ này, chúng ta mở một tệp có tên new_nlp_wiki.txt ở chế độ ghi (đối số 'w'), nghĩa là mọi nội dung hiện có của tệp sẽ bị ghi đè. Sau đó, chúng ta gọi phương thức write() trên đối tượng tệp để ghi chuỗi “New wiki entry: ChatGPT” vào tệp.

Nếu bạn muốn nối thêm văn bản vào một tệp hiện có thay vì ghi đè, bạn có thể mở tệp ở chế độ nối (đối số 'a') như sau:

with open("new_nlp_wiki.txt", "a") as file:
    file.write("New wiki entry: ChatGPT")

Ghi tệp văn bản bằng phương thức to_csv() của pandas

Có lẽ cách dễ nhất để ghi tệp văn bản bằng pandas là dùng phương thức to_csv(). Hãy xem nó hoạt động!

nlp_wiki = pd.read_table("nlp_wiki.txt", header=None, delimiter=None)
nlp_wiki.to_csv("nlp_wiki_pandas.txt", sep="\t", index=False)

Ở dòng mã đầu, chúng ta đọc một tệp văn bản bằng phương thức read_table() như đã trình bày ở phần trước. Sau đó, chúng ta lưu tệp bằng phương thức to_csv() và chỉ định ký tự phân tách là tab ('\t'), đồng thời đặt đối số index là False để loại trừ chỉ mục hàng khỏi đầu ra.

Tóm tắt

Hy vọng bạn thấy hướng dẫn này hữu ích! Tóm lại, chúng ta đã đề cập:

Chủ đề

Liên quan