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

Cách lấy thư mục hiện tại trong Python

Để lấy thư mục làm việc hiện tại trong Python, bạn có thể dùng os.getcwd() từ mô-đun os hoặc pathlib.Path.cwd() từ mô-đun pathlib.

Khám phá cùng AI

Nhiều chương trình Python cần điều hướng hệ thống tệp để đọc và ghi tệp. Một thao tác thường gặp là lấy thư mục làm việc hiện tại, thường được viết tắt là CWD.

Python có hai mô-đun chính có thể dùng để truy cập đường dẫn hệ thống tệp: os module và mô-đun pathlib.

Mô-đun os cung cấp cách tiếp cận truyền thống để lấy thư mục làm việc hiện tại và làm việc với đường dẫn và hệ thống tệp.

Mô-đun pathlib mới hơn, cung cấp cách tiếp cận hướng đối tượng, mạnh mẽ và đa nền tảng.

Trong hướng dẫn này, tôi sẽ khám phá các kỹ thuật để lấy và thao tác thư mục làm việc hiện tại. Nếu bạn muốn tìm hiểu thêm về Python, hãy xem thêm một số bài viết khác của tôi:

Python: Cách lấy thư mục làm việc hiện tại (CWD)

Thư mục làm việc hiện tại là thư mục nơi một chương trình Python được thực thi. Nó đóng vai trò là điểm tham chiếu cho các đường dẫn tương đối và cho phép chương trình truy cập tệp và tài nguyên trong hệ thống thư mục.

Hãy xem cách truy cập thư mục làm việc hiện tại bằng các mô-đun os và pathlib và so sánh hai cách giải quyết.

Sử dụng os.getcwd()

Mô-đun os cho phép truy cập vào hệ điều hành của máy tính. Hàm getcwd() lấy thư mục làm việc hiện tại:

import os
cwd = os.getcwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp

Kết quả hiển thị đường dẫn của thư mục chứa tập lệnh. Định dạng đường dẫn phụ thuộc vào hệ điều hành. Kết quả trên dành cho các hệ điều hành POSIX như Linux, Unix và macOS.

Cùng đường dẫn đó trên hệ thống Windows sẽ hiển thị như sau:

C:\Users\sg\Documents\GitHub\datacamp

Giá trị trả về từ os.getcwd() là một chuỗi:

print(type(cwd))
<class 'str'>

Vì vậy, chúng ta cần dùng các phương thức chuỗi và các thao tác với chuỗi khác để xử lý đường dẫn này.

Sử dụng pathlib.Path.cwd()

Python 3.4 giới thiệu mô-đun pathlib, cung cấp cách tiếp cận hướng đối tượng để truy cập và thao tác đường dẫn tệp. Lớp chính trong pathlib là Path, mà ta có thể import trước khi lấy thư mục làm việc hiện tại:

from pathlib import Path
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp

Kết quả in ra từ Path.cwd() trông giống giá trị trả về của os.getcwd(). Tuy nhiên, Path.cwd() không trả về chuỗi. Ta có thể xác nhận bằng cách in kiểu của đối tượng trả về hoặc hiển thị biểu diễn chuỗi chính thức của nó bằng repr():

print(type(cwd))
print(repr(cwd))
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')

Trên máy tính Windows, Path.cwd() trả về một đối tượng WindowsPath.

Các đối tượng PosixPath và WindowsPath cung cấp chức năng tương tự để hỗ trợ chương trình đa nền tảng. Dưới đây là một số thuộc tính của các đối tượng này:

print(cwd.parent)
print(cwd.name)
/Users/sg/Documents/GitHub
datacamp

Bất cứ khi nào có thể, nên ưu tiên dùng mô-đun pathlib vì hiện đại hơn và giúp xử lý đường dẫn dễ dàng hơn. Bạn có thể đọc hướng dẫn toàn diện về cách dùng pathlib trong Python nếu muốn tìm hiểu thêm.

Làm việc với thư mục hiện tại

Các chương trình Python thường cần thao tác đường dẫn, ví dụ để lưu tệp vào một thư mục con. Giả sử chúng ta cần tạo một thư mục con mới trong thư mục làm việc hiện tại và lưu một tệp văn bản vào thư mục mới.

Sử dụng mô-đun os

Hàm getcwd() trong mô-đun os trả về một chuỗi. Do đó, có thể tự chỉnh sửa chuỗi này để thay đổi đường dẫn. Tuy nhiên, các chỉnh sửa cần thiết sẽ khác nhau tùy hệ điều hành vì mỗi hệ có định dạng đường dẫn khác nhau. Một lựa chọn tốt hơn là dùng os.path.join():

import os
cwd = os.getcwd()
output_path = os.path.join(cwd, "testing_os")
print(output_path)
/Users/sg/Documents/GitHub/datacamp/testing_os

Đường dẫn mà os.path.join() trả về có định dạng đúng cho hệ điều hành đang dùng. Hàm này trả về một chuỗi là đường dẫn mới. Ta có thể kiểm tra thư mục con này đã tồn tại hay chưa với os.path.exists(), hàm trả về một Boolean:

print(os.path.exists(output_path))
False

Điều này cho thấy đường dẫn được biểu diễn bởi output_path chưa tồn tại. Mô-đun os cung cấp công cụ để tạo thư mục này. Hàm os.mkdir() tạo một thư mục mới:

os.mkdir(output_path)
print(os.path.exists(output_path))
True

Thư mục con mới giờ đã tồn tại, và ta có thể lưu các tệp mới vào thư mục này:

output_file = os.path.join(output_path, "test.txt")
with open(output_file, "w") as file:
    file.write("Testing path modification with the 'os' module")

Biến output_file chứa tên tệp đầu ra mong muốn kèm đường dẫn đầy đủ. Tệp văn bản này được tạo trong thư mục con /testing_os bên trong thư mục làm việc hiện tại.

Ta cũng có thể liệt kê tất cả mục trong một thư mục bằng os.listdir():

for item in os.listdir(output_path):
    print(item)
test.txt

Hàm os.listdir() trả về một danh sách chứa tất cả các mục trong thư mục. Đoạn mã này lặp qua danh sách để hiển thị từng tệp hoặc thư mục trên một dòng riêng. Trong ví dụ này, thư mục chỉ chứa một tệp văn bản.

Sử dụng mô-đun pathlib

Mô-đun pathlib mới hơn cũng cung cấp công cụ để tạo đường dẫn mới. Mô-đun này dùng toán tử gạch chéo xuôi / để kết hợp các thành phần thành một đường dẫn. Đây là cùng toán tử dùng cho phép chia với kiểu số, nhưng cũng là ký tự dùng trong đường dẫn tệp trên các hệ điều hành POSIX. Hãy tạo một đường dẫn mới và kiểm tra xem nó chưa tồn tại:

from pathlib import Path
cwd = Path.cwd()
output_path = cwd / "testing_pathlib"
print(output_path)
print(Path.exists(output_path))
/Users/sg/Documents/GitHub/datacamp/testing_pathlib
False

Lớp Path có phương thức riêng .mkdir() để tạo thư mục mới:

Path.mkdir(output_path)
print(Path.exists(output_path))
True

Vì output_path là một đối tượng PosixPath hoặc WindowsPath, ta có thể dùng toán tử gạch chéo xuôi ở bất kỳ đâu để tạo đường dẫn mới:

with open(output_path / "test.txt", "w") as file:
    file.write("Testing path modification with the 'pathlib' module")

Tệp văn bản mới được tạo trong thư mục /testing_pathlib.

Ta có thể dùng phương thức Path .iterdir() để lặp qua từng mục trong một thư mục:

for item in Path.iterdir(output_path):
    print(item)
/Users/sg/Documents/GitHub/datacamp/testing_pathlib/test.txt

Tương tự các công cụ khác trong pathlib, giá trị trả về không phải chuỗi. Thay vào đó, là một đối tượng PosixPath hoặc WindowsPath. Ta có thể dùng thuộc tính .name để hiển thị tên tệp hoặc thư mục mà không kèm đường dẫn đầy đủ:

for item in Path.iterdir(output_path):
    print(item.name)
test.txt

Trong khi os.listdir() trả về một danh sách, pathlib.Path.iterdir() trả về một đối tượng generator (bạn có thể đọc hướng dẫn về Iterator và Generator trong Python nếu cần ôn lại):

print(Path.iterdir(cwd))
<generator object Path.iterdir at 0x1036b2c20>

Hành vi này tuân theo thực tiễn tốt trong Python hiện đại vì iterator và generator hiệu quả hơn trong một số tình huống.

Thay đổi thư mục làm việc hiện tại (CWD)

Bạn cũng có thể thay đổi thư mục làm việc hiện tại trực tiếp từ trong chương trình Python bằng os.chdir(). Vì đây không phải thao tác liên quan trực tiếp đến đường dẫn, nên không có phiên bản thay thế trong pathlib. Tuy vậy, ta vẫn có thể dùng các đối tượng pathlib.Path làm đối số:

import os
from pathlib import Path
cwd = Path.cwd()
print(cwd)

os.chdir(cwd.parent)
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
/Users/sg/Documents/GitHub

Thư mục làm việc đã thay đổi. Ta cũng có thể dùng cwd.parent.resolve() để đảm bảo mọi liên kết tượng trưng được xử lý đúng. Đối số trong os.chdir() cũng có thể là chuỗi, chẳng hạn các đường dẫn do các hàm trong mô-đun os trả về.

Cần thận trọng khi thay đổi thư mục làm việc trong chương trình để tránh những hành vi ngoài ý muốn.

Thực tiễn tốt và mẹo

Dưới đây là một số thực tiễn tốt và mẹo khi làm việc với đường dẫn trong Python:

Thực tiễn tốt khi làm việc với đường dẫn trong Python

Kết luận

Điều hướng và thao tác đường dẫn tệp là yêu cầu phổ biến trong nhiều chương trình Python. Mô-đun os cung cấp các hàm truyền thống để xử lý các tác vụ này, trong khi mô-đun pathlib mang đến cách tiếp cận hướng đối tượng hiện đại hơn. Việc dùng pathlib không chỉ đơn giản hóa nhiều thao tác mà còn giúp mã của bạn đa nền tảng và dễ đọc hơn.

Dù bạn đang bảo trì một codebase hiện có dùng os hay bắt đầu một dự án mới nơi có thể tận dụng pathlib, hiểu cả hai mô-đun và khả năng của chúng sẽ giúp bạn linh hoạt và tự tin quản lý đường dẫn trong bất kỳ dự án Python nào.

Bạn có thể tiếp tục hành trình học Python với các khóa học sau:

Stephen Gruppetta

Tác giả

Stephen Gruppetta

Tôi học Vật lý và Toán ở bậc đại học tại Đại học Malta. Sau đó, tôi chuyển đến London và lấy bằng Tiến sĩ Vật lý tại Imperial College. Tôi nghiên cứu các kỹ thuật quang học mới để chụp ảnh võng mạc người. Hiện nay, tôi tập trung vào việc viết về Python, truyền đạt về Python và giảng dạy Python.

Chủ đề

Liên quan