Trong bài viết dưới đây, cùng ICANTECH tìm hiểu về một chủ đề được đang rất nhiều người quan tâm trong thời gian qua, đó là cách tạo cây thư mục cho dòng lệnh trong Python.
Có nhiều giải pháp khác nhau để bạn xây dựng một command-line (dòng lệnh) để liệt kê nội dung của một thư mục hoặc thư mục theo sơ đồ dạng cây. Lệnh xây dựng cây hầu hết đều có sẵn trên các hệ điều hành. Bên cạnh đó còn có một số công cụ có sẵn khác như treelib, pathlib…
Trình tạo cây thư mục mà chúng ta sắp tạo ở phần sau có CLI (Command Line Interface) thân thiện với người dùng. Nó cũng đi kèm với các tính năng đặc biệt, chẳng hạn như hiển thị sơ đồ cây với nội dung của một thư mục trên terminal (thiết bị đầu cuối).
Trước khi đi vào hướng dẫn cách tạo cây thư mục trong Python, chúng ta hãy cùng tìm hiểu truy trình các bước tạo cây thư mục như thế nào.
Để tạo cấu trúc thư mục, bạn cần tạo một số module và packages. Cấu trúc thư mục trong một dự án Python cơ bản được thể hiện như sau:
/mytree_project/
│
├── mytree/
│ ├── my_tree.py
│ ├── __init__.py
│ └── cli.py
│
├── README.md
└── tree.py
Việc tạo ra một sơ đồ cây phản ánh chính xác thông tin của một thư mục trong hệ thống tệp nhìn bề ngoài có vẻ đơn giản nhưng thực tế phức tạp hơn bạn nghĩ. Quá trình này được chia thành các bước sau:
Nhiệm vụ tìm kiếm một tập tin cụ thể trong một thư mục được áp dụng theo cách đệ quy. Nếu không tìm thấy tệp ngay lập tức, bạn có thể điều hướng đến các thư mục con và lặp lại quy trình, mở từng thư mục con để kiểm tra tệp.
Chúng ta có cấu trúc cây thư mục như sau:
Tiếp theo chúng tôi sẽ hướng dẫn bạn các bước để xây dựng giao diện dòng lệnh.
Ở bước 1, bạn cần hiểu được bố cục ứng dụng cho dự án tạo cây thư mục của mình. Bạn hãy tạo một thư mục mới trên tệp hệ thống có tên mytree_project. Trong thư mục, chúng ta cần tạo hai tệp trống là:
Tiếp theo, bạn sẽ tạo thư mục con có tên mytree, chứa các tệp trống sau:
Thư mục dự án của bạn có được như sau:
/mytree_project/
│
├── mytree/
│ ├── my_tree.py
│ ├── __init__.py
│ └── cli.py
│
├── README.md
└── tree.py
Đến đây, bạn cần thực hiện thiết lập bổ sung bằng cách thêm nội dung sau vào tệp __init__.py của mình:
# __init__.py
"""Top-level package for RP Tree."""
__version__ = "0.1.0"
Python sử dụng các tệp __init__.py để biến một thư mục bình thường thành một package có chứa các module như my_tree.py và cli.py như ví dụ ở trên. Các package và module là những công cụ cho phép tổ chức và cấu trúc code Python. Chúng cho phép nhóm các nhóm code thành các đơn vị nhỏ hơn và dễ quản lý hơn, giúp tái sử dụng và dễ dàng chia sẻ hơn. Thư viện chuẩn Python cũng sử dụng phương pháp tổ chức này, với nhiều module khác nhau được nhóm thành các gói.
Sau khi đã thiết lập được bố cục của dự án, bạn sẽ thực hiện viết code cho các chức năng chính của dự án. Nói cách khác, bạn sẽ viết code để tạo sơ đồ một cây thư mục đầy đủ từ đường dẫn thư mục đầu vào. Bạn hãy xem ví dụ dưới đây:
import os
import pathlib
PIPE = "│"
ELBOW = "└──"
TEE = "├──"
PIPE_PREFIX = "│ "
SPACE_PREFIX = " "
Trong đoạn mã trên, chúng ta nhập hai module là os và pathlib. Module os cung cấp cách tương tác với hệ điều hành, còn module pathlib cung cấp cách hướng đối tượng để làm việc với đường dẫn tệp.
Chúng ta có 3 biến: PIPE, ELBOW và TEE. Các biến này lần lượt chứa các ký tự chuỗi '│', '└──' và '├──'. Các ký tự này được sử dụng để tạo cấu trúc dạng cây khi hiển thị cấu trúc thư mục.
Các biến PIPE_PREFIX và SPACE_PREFIX lần lượt chứa chuỗi '│ ' và chỗ trống. Các chuỗi này được sử dụng làm tiền tố cho các dòng trong cấu trúc dạng cây và được dùng để biểu thị cấp độ của thư mục hoặc tệp trong cấu trúc. Trong đó PIPE, ELBOW và TEE được sử dụng để biểu thị các mức và PIPE_PREFIX và SPACE_PREFIX được sử dụng để tạo ra biểu diễn trực quan thích hợp.
Trong phần này, chúng ta sẽ xác định các lớp để tạo sơ đồ cây thư mục và hiển thị nó ra màn hình. Bạn hãy xem đoạn code ví dụ dưới đây:
class DirectoryTreeGenerator:
def __init__(self, root_dir):
self._generator = _TreeGenerator(root_dir)
def generate(self):
tree = self._generator.build_tree()
for entry in tree:
print(entry)
Tiếp theo, chúng ta sẽ tạo lớp _TreeGenerator để duyệt hệ thống tệp và tạo sơ đồ cây thư mục. Ví dụ:
class _TreeGenerator:
def __init__(self, root_dir: str) -> None:
self._root_dir = pathlib.Path(root_dir)
self._tree = []
def build_tree(self) -> List[str]:
self._tree_head()
self._tree_body(self._root_dir)
return self._tree
def _tree_head(self) -> None:
self._tree.append(f"{self._root_dir}{os.sep}")
self._tree.append(PIPE)
Tiếp tục chúng ta sẽ tạo phương thức _tree_body() trong lớp _TreeGenerator. Ví dụ như sau:
class _TreeGenerator:
def _tree_body(self, directory, prefix=""):
entries = directory.iterdir()
entries = sorted(entries, key=lambda entry: entry.is_file())
entries_count = len(entries)
for index, entry in enumerate(entries):
connector = ELBOW if index == entries_count - 1 else TEE
if entry.is_dir():
self._add_directory(
entry, index, entries_count, prefix, connector
)
else:
self._add_file(entry, prefix, connector)
Trong hướng dẫn cách tạo cây thư mục tiếp sau, chúng ta sẽ viết phương thức _tree_body() trong lớp _TreeGenerator, phương thức này cung cấp chức năng cốt lõi là tạo sơ đồ cây thư mục.
Ví dụ:
class _TreeGenerator:
def _tree_body(self, directory, prefix=""):
entries = directory.iterdir()
entries = sorted(entries, key=lambda entry: entry.is_file())
entries_count = len(entries)
for index, entry in enumerate(entries):
connector = ELBOW if index == entries_count - 1 else TEE
if entry.is_dir():
self._add_directory(
entry, index, entries_count, prefix, connector
)
else:
self._add_file(entry, prefix, connector)
Ở các phần trên chúng ta đã lần lượt hoàn thành đoạn code. Tiếp đến chúng ta sẽ chạy code để tạo cây thư mục. Bạn mở shell tương tác Python tại thư mục gốc của dự án và nhập đoạn code ví dụ ở dưới. Bạn cũng có thể tạo một tệp khác và nhập lớp liên quan.
from mytree.my_tree import DirectoryTreeGenerator
tree = DirectoryTree("./sample ")
tree.generate()
Đầu ra:
│
└── sample\
├── __pycache__\
│ └── sample.cpython-38.pyc
│
├── sample.py
└── __init__.py
Đầu ra của tệp thư mục gốc:
│
├── mytree\
│ ├── hello\
│ │ └── test_hello.py
│ │
│ ├── sample\
│ │ └── sample\
│ │ ├── __pycache__\
│ │ │ └── sample.cpython-38.pyc
│ │ │
│ │ ├── sample.py
│ │ └── __init__.py
│ │
│ │
│ ├── __pycache__\
│ │ ├── my_tree.cpython-38.pyc
│ │ └── __init__.cpython-38.pyc
│ │
│ ├── cli.py
│ ├── my_tree.py
│ └── __init__.py
│
├── readme.md
└── tree.py
Qua bài viết, chúng tôi đã chia sẻ đến bạn cách tạo cây thư mục trong Python đơn giản và hiệu quả. Hi vọng rằng bạn đã biết cách xây dựng được cây thư mục qua hướng dẫn ở trên, chúc bạn thành công!
Nếu bạn đang quan tâm đến học Python thì hãy tham khảo ngay khóa học lập trình Python tại ICANTECH nhé
Nguồn ảnh: ICANTECH.