Os.makenirs của Python không hiểu được


159

Tôi có một vấn đề nhỏ với ~ trong con đường của tôi.

Ví dụ mã này tạo ra một số thư mục có tên "~ / some_dir" và không hiểu rằng tôi muốn tạo some_dir trong thư mục chính của mình.

my_dir = "~/some_dir"
if not os.path.exists(my_dir):
    os.makedirs(my_dir)

Lưu ý đây là trên một hệ thống dựa trên Linux.

Câu trả lời:


277

Bạn cần mở rộng dấu ngã bằng tay:

my_dir = os.path.expanduser('~/some_dir')

1
Vì vậy, tôi đã không sử dụng os.path.Exanduser và đã làm những gì OP đã làm và python đã tạo thư mục "~" trong thư mục hiện tại của tôi. Làm thế nào tôi có thể xóa thư mục đó (mà không xóa thư mục chính thực tế)?
Chúc mừng

1
@HappyMittal cho những người khác thắc mắc, bạn chỉ cần sử dụng ./để tham chiếu thư mục hiện tại của mình và do đó ./~để xóa thư mục ~trong thư mục hiện tại. Để an toàn hơn, đơn giản nhất là cung cấp đường dẫn đầy đủ : rm -rf path/to/bad/dir/~.
kiềm

Hoặc thoát khỏi nó bằng dấu gạch chéo ngược:rm \~
DDMC

71

Việc chuyển đổi ~/some_dirthành $HOME/some_dirđược gọi là mở rộng dấu ngã và là một tính năng giao diện người dùng phổ biến. Hệ thống tập tin không biết gì về nó.

Trong Python, tính năng này được os.path.Exanduser triển khai :

my_dir = os.path.expanduser("~/some_dir")

Thật vậy, và nó là hoàn toàn hợp lệ để có một tập tin hoặc thư mục được đặt tên ~. Vì vậy, các phím tắt nhà vỏ là mơ hồ và tốt nhất nên tránh nếu bạn có thể.
bobince

7
Lưu ý rằng người ta CÓ THỂ truy cập tệp / thư mục có tên "~" trong thư mục hiện tại ngay cả khi xảy ra mở rộng dấu ngã, sử dụng ký hiệu "./~". Điều đó hoạt động vì ~ mở rộng chỉ xảy ra khi bắt đầu một tên tệp. Đây cũng là một cách hack thuận tiện cho các tên tệp bắt đầu bằng "-" hoặc các ký tự khác được xử lý đặc biệt bằng giao diện dòng lệnh. Bạn có thể nói rằng tôi có thể đã thực hiện quá nhiều cách hack shell script.
ddaa

The file system does not know anything about it.+1
Bin

15

Điều đó có thể là do Python không phải là Bash và không tuân theo các quy ước tương tự. Bạn có thể sử dụng điều này:

homedir = os.path.expanduser('~')

0
from srblib import verify_folder

verify_folder('path/to/folder')

Nó sẽ tạo một thư mục nếu không có nó sẽ không tạo một thư mục.

LƯU Ý : nó cũng sẽ tạo các thư mục trong đường dẫn (nếu cần)

srb@srb-pc:~/hello$ ls
srb@srb-pc:~/hello$ python3 
>>> from srblib import verify_folder
>>> verify_folder('~/hello/A/B')
>>> exit()
srb@srb-pc:~/hello$ ls
A
srb@srb-pc:~/hello$ ls A
B
srb@srb-pc:~/hello$ 

Chức năng này hoạt động như mkdir -p path/to/folder


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.