2017-04-11 18 views
2

ディレクトリへのパスと、そのディレクトリに含まれるファイルへのパス(おそらくネストされた多数のディレクトリが深い)を受け取るスクリプトを作成し、このファイルへのパスを外部ディレクトリに対して返します。外側のディレクトリが/home/hugomg/fooあり、内側のファイルが/home/hugomg/foo/bar/baz/unicorns.txtある場合Pythonでファイル名からプレフィックスを削除するにはどうしたらいいですか?

は例えば、私は、出力bar/baz/unicorns.txtにスクリプトをしたいと思います。

import os 

dir_path = "/home/hugomg/foo" 
file_path = "/home/hugomg/foo/bar/baz/unicorns.py" 

dir_path = os.path.realpath(dir_path) 
file_path = os.path.realpath(file_path) 

if not file_path.startswith(dir_path): 
    print("file is not inside the directory") 
    exit(1) 

output = file_path[len(dir_path):] 
output = output.lstrip("/") 
print(output) 

をしかし、これを行うには、より堅牢な方法があります:

今私はrealpathと文字列操作を使用して、それをやっていますか?私は現在のソリューションがこれを行う正しい方法であるとは確信していません。 startswithをrealpathと一緒に使用して、あるファイルが別のファイル内にあることをテストする正しい方法はありますか?そして、私が取り除く必要がある大胆なスラッシュで、その厄介な状況を避ける方法はありますか?

答えて

1

モジュールのcommonprefixrelpathを使用して、2つのパスの最も長い共通プレフィックスを見つけることができます。常にrealpathを使用することをお勧めします。

import os 
dir_path = os.path.realpath("/home/hugomg/foo") 
file_path = os.path.realpath("/home/hugomg/foo/bar/baz/unicorns.py") 
common_prefix = os.path.commonprefix([dir_path,file_path]) 

if common_prefix != dir_path: 
    print("file is not inside the directory") 
    exit(1) 
print(os.path.relpath(file_path, dir_path)) 

出力:

bar/baz/unicorns.txt 
+0

これもオフに感じている... lstripはない削除する接頭辞として、削除する文字の集合としてのパラメータを扱います。 'dir_path'と' file_path'が正規化されていない、絶対パス名でもこれが機能しますか? – hugomg

+0

おそらく 'relpath'がより適していますか? – abccd

+0

[この質問](http://stackoverflow.com/questions/7287996/python-get-relative-path-from-comparing-two-absolute-paths/7288019#7288019)は私が求めていたものに近いです。ところで、そこにいる誰かがcommonprefixがcommonpath関数のために推奨されていないことを明らかに指摘しました。 – hugomg

関連する問題