icantech
Lập trình Python
1440
27/10/2023

Hướng dẫn cách tạo cây thư mục trong Python đơn giản

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.

1. Công cụ tạo cây thư mục 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).

2. Quy trình xây dựng cây thư mục

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.

2.1. Tạo cấu trúc thư mục

Để 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  

2.2. Phác thảo giải pháp tạo cây thư mục

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:

  • Bắt đầu trong thư mục chính
  • Kiểm tra tập tin
  • Nếu không tìm thấy tập tin, chuyển hướng di chuyển vào thư mục con
giai-phap-tao-cay-thu-muc

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.

3. Hướng dẫn cách tạo cây thư mục trong Python

Chúng ta có cấu trúc cây thư mục như sau: 

cau-truc-cay-thu-muc 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.

3.1. Thiết lập cấu trúc dự án

Ở 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à:

  • README.md
  • tree.py

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:

  • my_tree.py
  • __init__.py
  • cli.py

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.

3.2. Hướng dẫn cách tạo sơ đồ cây thư mục 

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. 

3.3. Tạo lớp thư mục cấp cao

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)  

3.4. Tạo lớp TreeGenerator

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) 

3.5. Chạy code tạo cây thư mục 

Ở 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

4. Lời Kết

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.

Share
Tags
Lập trình Python

Bài tương tự