Pythonのos.makedirsがパスの「〜」を理解できません


159

私のパスで〜に少し問題があります。

このコード例では、「〜/ some_dir」というディレクトリをいくつか作成していますが、ホームディレクトリにsome_dirを作成したかったことを理解していません。

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

これはLinuxベースのシステム上にあることに注意してください。

回答:


277

チルダを手動で展開する必要があります。

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

1
そのため、os.path.expanduserを使用せず、OPが実行したことを行い、Pythonは現在のディレクトリに「〜」ディレクトリを作成しました。(実際のホームディレクトリを削除せずに)そのディレクトリを削除するにはどうすればよいですか?
Happy Mittal

1
@HappyMittalは./、現在のディレクトリを参照して、現在のディレクトリ./~内のフォルダを削除するために単に使用することができるのではないかと思っています~。安全のために、完全なパスを指定するのが最も簡単ですrm -rf path/to/bad/dir/~
alkasm

:それとも、バックスラッシュでエスケープrm \~
DDMC

71

~/some_dirtoへの変換はチルド拡張$HOME/some_dir呼ばれ、一般的なユーザーインターフェイス機能です。ファイルシステムはそれについて何も知りません。

Pythonでは、この機能はos.path.expanduserによって実装されます。

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

確かに、という名前のファイルまたはディレクトリがあることは完全に有効です~。したがって、シェルのホームショートカットはあいまいであり、できる限り回避するのが最善です。
ボビンス、2013年

7
チルダ展開が行われている場合でも、「./〜」表記を使用して、現在のディレクトリの「〜」という名前のファイル/ディレクトリにアクセスできます。〜の展開はファイル名の先頭でのみ発生するため、これは機能します。また、 "-"で始まるファイル名や、コマンドラインインターフェースで特別に処理されるその他の文字をハックするのにも便利です。おそらく、シェルスクリプトのハッキングが多すぎると言っていいでしょう。
ddaa 2010年

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

15

これはおそらく、PythonがBashではなく、同じ規則に従っていないためです。あなたはこれを使うかもしれません:

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

0
from srblib import verify_folder

verify_folder('path/to/folder')

フォルダーがない場合はフォルダーが作成され、フォルダーが作成されません。

:(必要に応じて)パスにフォルダも作成します

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$ 

この機能は次のように機能します mkdir -p path/to/folder


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.