AI Cho Mọi Người

AI Cho Mọi Người

File trong python

 

Việc xử lý file là công việc rất quan trọng, đặc biệt trong data science và machine learning. Dưới đây là một số kĩ thuật xử lí file thông thường.

Đọc File

Để thao tác một file trong python, chúng ta dùng cấu trúc chương trình như sau

trong đó, mode có thể là 'r' để đọc file, hay 'w''a' để tạo file và ghi nội dung cho file. Chúng ta cần chú ý 2 thao tác openclose mỗi khi thao tác đến file.

Ví dụ, chúng ta được yêu cầu viết chương trình đọc file hello_world.txt cho trước và in nội dung của file ra. File hello_world.txt có nội dung như sau

Source code của chương trình như sau

Trong ví dụ này tham số thứ 2 có giá trị là 'r' để đọc file. Hàm read() sẽ đọc nội dung của file và trả về giá trị kiểu string.

Ghi File

Giả sử chúng ta cần tạo file my_file.txt và ghi 2 dòng text vào file. Code python để thực hiện yêu cầu trên như sau

Mở file my_file.txt từ ổ đĩa để xem nội dung file

Ở ví dụ này, tham số thứ 2 của hàm open có giá trị là 'w', tức là tạo và ghi nội dung file. Trong trường hợp file my_file.txt đã tồn tại rồi thì chương trình tạo mới (tạo đè) file my_file.txt mà không quan tâm đến nội dung của file cũ. Để kiểm chứng điều này, chúng ta chạy tiếp đoạn code sau

Mở lại file my_file.txt từ ổ đĩa để xem nội dung file

Trong trường hợp chúng ta muốn ghi tiếp tục nội dung vào một file đã tồn tại, thì chúng ta chỉ cần thay đổi tham số thứ 2 của hàm open thành 'a' (viết tắt cho từ append, nghĩa là thêm tiếp) như sau.

Mở lại file my_file.txt từ ổ đĩa để xem nội dung file sau khi dùng mode 'a'

Một số hàm thường dùng với file

Hàm os.path.exists

Hàm os.path.exists(path) được dùng để kiểm tra một file có tồn tại hay không. Đoạn code sau minh họa dùng hàm os.path.exists(path) để kiểm tra 2 file, my_file.txtnon_existence_file.txt có tồn tại hay không.

Package này hỗ trợ một số hàm rất hữu ích, các bạn có thể tìm hiểu thêm tại đây https://docs.python.org/3/library/os.html

Hàm split

Giả sử chúng ta đọc dữ liệu từ file students.txt chứa thông tin học sinh. Trong đó mỗi dòng bao gỗm thông tin mã số, tên học sinh, và ngày tháng năm sinh. Nhiệm vụ yêu cầu là in ra tên học sinh. Dưới đây là định dạng dữ liệu ở file students.txt.

Đa phần ở định dạng như trên thường được thấy khi ta thu nhập dữ liệu hoặc tham gia các bài toán của kaggle. Ví dụ trên mỗi thuộc tính được ngăn cách bởi mỗi dấu phẩy ,. Duyệt qua mỗi chuỗi rồi đếm dấu phẩy là phương pháp không hiểu quả. Chúng ta có thể dùng hàm split để xử lý việc này một cách hiệu quả

Hàm join

Hàm join giúp cho việc ghi dữ liệu có format (ví dụ mỗi thuộc tính được ngăn cách nhau một kí hiệu được quy định trước). Thông thường, dữ liệu sau khi thu thập để ghi vào file là phải một kiểu chuỗi. Vì vậy khi chuyển các thuộc tính và viết ngăn cách nhau một kí hiệu bất kỳ, thì cần phải chuyển tất cả về kiểu dữ liệu chuỗi.

Thực hành

Trong bài thực hành này chúng ta sẽ thao tác trên Iris dataset và sẽ áp dụng các kiến thức trên để xử lý việc đọc file. Iris dataset gồm 3 loài hoa: Setosa, Versicolour, và Virginica. Mỗi mẫu dữ liệu gồm chiều dài và chiều rộng cánh hoa sepal (cm), chiều dài và chiều rộng cánh hoa petal (cm), và loài hoa (Iris-setosa, Iris-versicolor, và Iris-virginica).

Iris dataset được lưu trong file Iris.csv, một dạng text file trong đó các giá trị của một mẫu được phân cách bằng dấu phẩy. Chúng ta có thể mở để xem nội dùng file Iris.csv với bất kỳ một text editor thông thường nào đó. Hình sau hiển thị 3 dòng đầu tiên của file Iris.csv.

Chúng ta quan sát thấy dòng đầu tiên đóng vai trò header, mô tả ý nghĩa của một cột dữ liệu. Cột đầu tiên Id xác định thứ tự, phân biệt giữa các dòng. Cột này không quan trọng vì chúng ta không cần dùng đến thuộc tính này khi train các thuật toán machine learning.

Một điểm nữa là giá trị của một cuối cùng ở dạng string. Chúng ta cần chuyển sang giá trị kiểu số vì hầu hết các thuật toán yêu cầu giá trị label (class) có kiểu số (hay dạng vector của các số).

Đoạn code sau đọc file Iris.csv và hiển thị 10 dòng đầu tiên

Hàm readlines() trả về một list, trong đó mỗi phần tử là một dòng dữ liệu trong file Iris.csv và có kiểu string.

Chúng ta dùng thêm hàm split() để phân tách các cột giá trị như sau

Ba việc chúng ta cần xử lý tiếp là 1) Bỏ cột Id 2) Chuyển đổi 4 đặc trưng sang kiểu float và 3) Chuyển kiểu dữ liệu của một species từ string sang integer. Đoan code sau thực hiện 3 tác vụ trên.

Ở đoạn code này, chúng ta nên dùng thêm hàm strip() để xóa các khoảng trắng ở 2 đầu string. Các khoảng trắng này có thể làm cho chương trình sai về mặt logic.

Cuối cùng; chúng ta lưu mỗi mẫu dữ liệu thành một list, và lưu list này vào trong list data (list data chứa cả dataset).

 

Bài tập: Các bạn viết tiếp chương trình ở trên để tóm tắt dữ liệu Iris. Cụ thể, sau khi đọc file Iris.csv, các bạn cài đặt chức năng

1) Tính min, mean, max, và standard deviation cho 4 cột đặc trưng.

2) Đến số mẫu cho từng loài hoa