Tôi đã từng mở các tệp trong cùng thư mục với tập lệnh Python hiện đang chạy bằng cách sử dụng một lệnh như
open("Some file.txt", "r")
Tuy nhiên, tôi phát hiện ra rằng khi tập lệnh được chạy trong Windows bằng cách nhấp đúp vào tập lệnh, nó sẽ cố mở tệp từ thư mục sai.
Kể từ đó, tôi đã sử dụng một lệnh của mẫu
open(os.path.join(sys.path[0], "Some file.txt"), "r")
Bất cứ khi nào tôi muốn mở một tập tin. Điều này hoạt động cho việc sử dụng cụ thể của tôi, nhưng tôi không chắc sys.path[0]
có thể thất bại trong một số trường hợp sử dụng khác.
Vì vậy, câu hỏi của tôi là: cách tốt nhất và đáng tin cậy nhất để mở một tệp trong cùng thư mục với tập lệnh Python hiện đang chạy là gì?
Đây là những gì tôi đã có thể tìm ra cho đến nay:
os.getcwd()
vàos.path.abspath('')
trả về "thư mục làm việc hiện tại", không phải thư mục script.os.path.dirname(sys.argv[0])
vàos.path.dirname(__file__)
trả về đường dẫn được sử dụng để gọi tập lệnh, có thể là tương đối hoặc thậm chí trống (nếu tập lệnh nằm trong cwd). Ngoài ra,__file__
không tồn tại khi tập lệnh được chạy trong IDLE hoặc PythonWin.sys.path[0]
vàos.path.abspath(os.path.dirname(sys.argv[0]))
dường như trả về thư mục script. Tôi không chắc có sự khác biệt nào giữa hai thứ này không.
Biên tập:
Tôi chỉ nhận ra rằng những gì tôi muốn làm sẽ được mô tả tốt hơn là "mở một tệp trong cùng thư mục với mô-đun chứa". Nói cách khác, nếu tôi nhập một mô-đun tôi đã viết trong thư mục khác và mô-đun đó mở một tệp, tôi muốn nó tìm tệp trong thư mục của mô-đun. Tôi không nghĩ bất cứ điều gì tôi tìm thấy đều có thể làm điều đó ...
__file__
không thể được sử dụng, sau đó sử dụngsys.argv[0]
thay vìdirname(__file__)
. Phần còn lại nên làm việc như mong đợi. Tôi thích sử dụng__file__
vì trong mã thư viện,sys.argv[0]
có thể không trỏ đến mã của bạn, đặc biệt nếu được nhập qua một số tập lệnh của bên thứ 3.