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:
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:
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:
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)Được hỗ trợ bởi
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():
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')Được hỗ trợ bởi
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:
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)Được hỗ trợ bởi
/Users/sg/Documents/GitHub/datacamp/testing_osĐược hỗ trợ bởi
Đườ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:
Đ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))Được hỗ trợ bởi
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")withopen(output_file,"w")asfile:file.write("Testing path modification with the 'os' module")Được hỗ trợ bởi
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)Được hỗ trợ bởi
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))Được hỗ trợ bởi
/Users/sg/Documents/GitHub/datacamp/testing_pathlib
FalseĐược hỗ trợ bởi
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))Được hỗ trợ bởi
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:
withopen(output_path /"test.txt","w")asfile:file.write("Testing path modification with the 'pathlib' module")Được hỗ trợ bởi
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)Được hỗ trợ bởi
/Users/sg/Documents/GitHub/datacamp/testing_pathlib/test.txtĐược hỗ trợ bởi
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)Được hỗ trợ bởi
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):
<generator object Path.iterdir at 0x1036b2c20>Được hỗ trợ bởi
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)Được hỗ trợ bởi
/Users/sg/Documents/GitHub/datacamp
/Users/sg/Documents/GitHubĐược hỗ trợ bởi
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:
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:
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.
Tiếp tục phát triển kỹ năng Khoa học Dữ liệu hiện đại của bạn bằng cách tìm hiểu về các cấu trúc lặp (iterators) và biểu thức danh sách (list comprehensions).
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:
osmodule và mô-đunpathlib.Mô-đun
oscung 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
pathlibmớ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
osvàpathlibvà so sánh hai cách giải quyết.Sử dụng
os.getcwd()Mô-đun
oscho phép truy cập vào hệ điều hành của máy tính. Hàmgetcwd()lấy thư mục làm việc hiện tại: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:
Giá trị trả về từ
os.getcwd()là một chuỗi: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 trongpathliblàPath, mà ta có thể import trước khi lấy thư mục làm việc hiện tại:Kết quả in ra từ
Path.cwd()trông giống giá trị trả về củaos.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ằngrepr():Trên máy tính Windows,
Path.cwd()trả về một đối tượngWindowsPath.Các đối tượng
PosixPathvàWindowsPathcung 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:Bất cứ khi nào có thể, nên ưu tiên dùng mô-đun
pathlibvì 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
osHàm
getcwd()trong mô-đunostrả 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ùngos.path.join():Đườ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ớios.path.exists(), hàm trả về một Boolean:Điều này cho thấy đường dẫn được biểu diễn bởi
output_pathchưa tồn tại. Mô-đunoscung cấp công cụ để tạo thư mục này. Hàmos.mkdir()tạo một thư mục mới: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:
Biến
output_filechứ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_osbê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():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
pathlibMô-đun
pathlibmớ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:Lớp
Pathcó phương thức riêng.mkdir()để tạo thư mục mới:Vì
output_pathlà một đối tượngPosixPathhoặcWindowsPath, 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: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: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ượngPosixPathhoặcWindowsPath. 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 đủ:Trong khi
os.listdir()trả về một danh sách,pathlib.Path.iterdir()trả về một đối tượnggenerator(bạn có thể đọc hướng dẫn về Iterator và Generator trong Python nếu cần ôn lại):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ế trongpathlib. Tuy vậy, ta vẫn có thể dùng các đối tượngpathlib.Pathlàm đối số: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ố trongos.chdir()cũng có thể là chuỗi, chẳng hạn các đường dẫn do các hàm trong mô-đunostrả 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:
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
oscung cấp các hàm truyền thống để xử lý các tác vụ này, trong khi mô-đunpathlibmang đến cách tiếp cận hướng đối tượng hiện đại hơn. Việc dùngpathlibkhô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
oshay bắt đầu một dự án mới nơi có thể tận dụngpathlib, 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: