Chào mừng mọi người quay trở lại Julia Dojo. Trong level trước mình đã cover kha khá những cú pháp cơ bản trong Julia. Nhưng mọi người có nhận ra rằng, mình chưa nói về cách để nhập dữ liệu?
Nếu bạn được học C trên trường (nếu không học cũng không sao), chắc hẳn bạn đã được dạy cách nhập tay một dữ liệu bằng hàm scanf
. Trong Julia, bạn cũng có thể làm điều tương tự với hàm readline
. Nhưng, nếu chúng ta cần đưa vào xử lí những dữ liệu cồng kềnh (không nhất thiết lớn), việc nhập từ tay trở nên không thực dụng. Khi ấy, chúng ta sẽ phải làm việc với file.
Lưu và nạp dữ liệu
Đóng mở file
Để mở một file trong Julia, chúng ta dùng hàm open
. Hàm này sẽ trả về một con trỏ file
|
|
Sau khi làm việc với file xong, đừng quên đóng nó lại:
|
|
Ngoài ra, bạn có thể dùng cú pháp do
:
|
|
Nhưng làm việc với file kiểu gì?
File văn bản
Sau khi mở một file văn bản, bạn có thể tiến hành đọc từ file đó bằng hàm read
hoặc readline
để đọc từng dòng.
|
|
Lưu ý rằng, việc đọc file sẽ đẩy con trỏ file của bạn. Nếu bạn không biết con trỏ file là gì, hãy hiểu đơn giản rằng: nó đánh dấu vị trí bạn bắt đầu đọc. Để quay lại vị trí ban đầu, chúng ta dùng các hàm seek:
|
|
Để ghi một file, chúng ta phải mở file theo những chế đọc cho phép ghi (xem bảng trên). Sau đó:
|
|
Việc ghi vào file không thực sự ghi vào ổ đĩa nơi chứa file, nó chỉ lưu vào một vùng đệm thôi. Việc ghi vào ổ đĩa sẽ xảy ra khi bạn đóng file.
w
hoặc w+
, file của bạn sẽ bị xóa sạch để ghi lại từ đầu.Ngoài ra, trong một số trường hợp, bạn muốn đọc toàn bộ file hoặc ghi đè toàn bộ file, chúng ta có thể không cần mở, đóng file mà dùng trực tiếp read
với write
luôn:
|
|
Ma trận
Trong Julia thì có muôn vàn cách để đọc, ghi ma trận ra ổ cứng. Bạn có thể dùng file văn bản (CSV chẳng hạn), file Excel, file của Matlab, file của Python và thậm chí cả những định dạng riêng của Julia nữa.
Cách đơn giản nhất để lưu ma trận là một file văn bản. Julia cũng cấp một module tiêu chuẩn tên là DelimitedFiles
, dùng để đọc và ghi những file dữ liệu được ngăn cách, chẳng hạn như file mat.csv
dưới đây:
|
|
Chúng ta dùng DelimitedFiles
để đọc file trên thành ma trận một cách dễ dàng:
|
|
Để ghi một ma trận ra file thay vì dùng “read”, chúng ta dùng “write”:
|
|
open
như ở trên với mode "a"
, sau đó thay tên file trong những hàm trên bằng con trỏ file.Ưu điểm của cách này là nó rất dễ, nhưng:
- cách này không lưu lại kiểu dữ liệu của ma trận (chẳng hạn mình có một ma trận nhưng ma trận này không chứa số)
- chậm: ví dụ chỉ lấy ma trận vuông kích cỡ 3 nên điều này không thể hiện rõ lắm.
Vậy chúng ta dùng cách nào để lưu? Cách đơn giản thứ 2 là dùng file .npy
(file ma trận của Numpy). Để làm điều này chúng ta cần có gói Pycall
. PyCall cung cấp giao diện giá đơn giản để chúng ta thao tác với Numpy.
|
|
Việc đọc/ghi file ma trận với ma trận M như trên sẽ chỉ mất khoảng 1 giây. Còn với DelimitedFiles chúng ta sẽ mất kha khá thơi gian. Nếu bạn cần đọc file .csv
hãy dùng gói CSV.jl
hoặc DataFrames.jl
.
Ngoài ra, chúng ta có thể dùng file ma trận của Matlab với gói MAT.jl
|
|
Lưu trữ vạn năng
Ở trên mình có nói chúng ta có thể lưu ma trận theo “định dạng riêng của Julia”. Thực ra có một vài, không chỉ một định dạng, trong đó khá nổi bật là hai định dạng của JuliaDB
và JLD2
.
Cả hai định dạng file trên đều rất nhanh và tiện lợi để dùng. Không những lưu được số, chữ hay những kiểu dữ liệu nguyên thủy, hai anh này còn lưu được gần như tất cả các loại dữ liệu trong Julia, kể cả dữ liệu người dùng định nghĩa.
JuliaDB
thiên về lưu trữ cơ sở dữ liệu nhiều hơn (lưu các bảng dữ liệu), mình sẽ không nói thêm. Các bạn tự tìm hiểu nhé!JLD2
cung cấp hai macro để tiện lưu, nạp dữ liệu:
|
|
Cách trên không tiện lắm vì chúng ta không đổi được tên của các biến được lưu hay nạp, đồng thời chúng ta cũng không thể ghi thêm hay gì khác. Thay vào đó, chúng ta có thể mở file .jld2
và tạo con trỏ file như những loại file khác.
|
|
Ngoài ra, có một gói mang tên FileIO.jl
, gói này cung cấp giao diện để mở và làm việc kha khá nhiều loại file. JLD2
cũng được hỗ trợ:
|
|
Lưu ý rằng FileIO
không trực tiếp mở file mà phải sử dụng một gói khác hỗ trợ. Bạn vẫn cần JLD2
để làm việc với file .jld2
.
Điều hay nhất của JLD2
và FileIO
là, khi bạn lưu, thông tin về kiểu dữ liệu của bạn cũng sẽ được lưu. Khi nạp lại để sử dụng, chúng ta không cần xử lí thêm về kiểu.
Kiểu file dữ liệu khác
Ngoài ra chúng ta còn có những kiểu dữ liệu phức hợp khác được lưu dưới dạng file. Mình sẽ chỉ nêu tên gói, các bạn sẽ tự tìm hiểu nhé:
Kiểu dữ liệu | Các gói liên quan |
---|---|
npy, pickle | PyCall.jl |
XML | EzXML.jl , XMLDict.jl , LightXML |
Excel | ExcelFiles.jl , ExcelReaders.jl |
JSON | JSON.jl |
BSON | BSON.jl |
HDF5 | HDF5.jl |
Một số file âm thanh | LibSndFile.jl , MP3.jl , WAV.jl |
File ảnh | Images.jl |
Arrow, Feather | Feather.jl , Arrow.jl |
Làm việc với hệ thống file
Các hệ điều hành thường sử dụng các hệ thống file các nhau. Cụ thể hơn, chúng ta thường phải quan tâm về cách tương tác vì chúng ta là người dùng. May thay, Julia cung cấp một giao diện chung để tương tác với hệ thống file khác nhau, giúp chúng ta tập trung vào những việc khác. Mình sẽ giới thiệu một số hàm mình nghĩ rằng hữu dụng.
Đường dẫn tới thư mục hiện tại.
|
|
Đường dẫn tới thư mục/file tạm thời tương ứng với mỗi hệ điều hành.
|
|
Chuyển tới một thư mục.
|
|
Ghép các đường dẫn, hàm này dùng để xử lý sự khác biệt giữa hệ thống file của Windows và *Nix.
|
|
Tạo thư mục, mkdir
sẽ tạo thư mục nếu tìm thấy các thư mục cha, còn mkpath sẽ tạo thư mục cha nếu không tìm thấy.
|
|
Đọc thư mục:
|
|
Copy (cp
), di chuyển (mv
), xóa (rm
) file:
|
|
Kiểm tra xem một đường dẫn có ứng với một file/thư mục/đường dẫn hay không:
|
|
Thư mục của người dùng:
|
|
Lấy ra đường dẫn thư mục, tên file từ dường dẫn:
|
|
Tạm kết
Lúc đầu viết mình cũng không nghĩ bài sẽ dài như thế này. Tổng kết lại, chúng ta đã tìm hiểu về:
- Cách đọc, ghi file
- Lưu trữ tùy ý các kiểu dữ liệu của Julia
- Tương tác với hệ thống file thông qua Julia
Lưu ý thêm, nếu bạn sử dụng con trỏ file, đừng quên đóng file sau khi làm việc xong. Ngoài ra, với cú pháp do
, con trỏ file được cho là local và file sẽ đóng ngay khi khối do
chạy xong.
Tham khảo: