私はパスにスラッシュのみを使用する傾向があり( '/')、pythonはWindowsでもこれに満足しています。os.path.joinの説明では、クロスプラットフォームにしたいのですが、使用するとスラッシュが入ります:
import os
a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'
print os.path.join(a, b, c, d, e)
# Result:
c:/myFirstDirectory/mySecondDirectory\myThirdDirectory\myExecutable.exe
これは正しいです?後で確認して修正する必要がありますか、より良い方法がありますか?
ありがとう
編集:パスを要求するときにスラッシュも混在します
import sys
for item in sys.path:
print item
# Result:
C:\Program Files\Autodesk\Maya2013.5\bin
C:\Program Files\Autodesk\Maya2013.5\mentalray\scripts\AETemplates
C:\Program Files\Autodesk\Maya2013.5\Python
C:\Program Files\Autodesk\Maya2013.5\Python\lib\site-packages
C:\Program Files\Autodesk\Maya2013.5\bin\python26.Zip\lib-tk
C:/Users/nookie/Documents/maya/2013.5-x64/prefs/scripts
C:/Users/nookie/Documents/maya/2013.5-x64/scripts
C:/Users/nookie/Documents/maya/scripts
C:\Program Files\Nuke7.0v4\lib\site-packages
C:\Program Files\Nuke7.0v4/plugins/modules
スラッシュの一部を自分で指定し、 os.path.join
で他のものを選択できるようになりました。 pythonにすべてを選択させるか、すべてを自分で提供する方が良いでしょう。 Pythonは、パスの後半部分に円記号を使用します。これは、Windowsでは円記号がデフォルトであるためです。
import os
a = 'c:' # removed slash
b = 'myFirstDirectory' # removed slash
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'
print os.path.join(a + os.sep, b, c, d, e)
私はこれをテストしていませんが、これが役立つことを願っています。ベースパスを使用し、他の1つの要素(ほとんどの場合はファイル)を結合するだけで済む方が一般的です。
ところで; os.sep
を使用して、pythonが実行されているオペレーティングシステムに最適なセパレータを取得したい場合に使用できます。
Edit:ダッシュトムバン状態として、明らかにWindowsの場合、パスのルートにセパレーターを含める必要があります。それ以外の場合は、絶対パスではなく相対パスを作成します。
.replace()
の後にpath.join()
を使用して、スラッシュが正しいことを確認できます。
# .replace() all backslashes with forwardslashes
print os.path.join(a, b, c, d, e).replace("\\","/")
これにより、出力が得られます。
c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe
@sharpcloudが示唆したように、入力文字列からスラッシュを削除する方が良いでしょうが、これは代替手段です。
abspathを使用してみてください(python 3を使用)
import os
a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'
print(os.path.abspath(os.path.join(a, b, c, d, e)))
出力:
c:\ myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe
プロセスは終了コード0で終了しました
コメントに基づく編集:path = os.path.normpath(path)
私の以前の答えにはエスケープ文字を処理する機能がないため、使用しないでください:
次に、正しいシンボルを使用してそれらを接着します。
import os
path = 'c:\www\app\my/folder/file.php'
# split the path to parts by either slash symbol:
path = re.compile(r"[\/]").split(path)
# join the path using the correct slash symbol:
path = os.path.join(*path)
何らかの理由でパスを自分で提供する必要があり、上記の何かを使用している場合python 3.4を使用できます pathlib
from pathlib import Path, PurePosixPath
a = PurePosixPath('c:/')
b = PurePosixPath('myFirstDirectory/')
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'
print(a / b / c / d / e)
# Result
c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe
ユーザーがアセットディレクトリの場所を指定する必要があり、コードがWindowsパス文字列を使用して検索していたときに、これを使用しました
In [1]: from pathlib import Path, PureWindowsPath
In [2]: USER_ASSETS_DIR = Path('/asset/dir') # user provides this form environment variable
In [3]: SPECIFIC_ASSET = PureWindowsPath('some\\asset')
In [4]: USER_ASSETS_DIR / SPECIFIC_ASSET
Out[4]: PosixPath('/asset/dir/some/asset')
os
はスラッシュを追加し、スラッシュが重複しないようにしますので、文字列ではそれらを省略します
_import os
# Don't add your own slashes
a = 'C:'
b = 'myFirstDirectory'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'
print os.path.join(a, b, c, d, e)
C:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe
_
追加:
Sysパスにスラッシュが混在している理由がわかりません(Linux OSを使用していくつかのフォルダを追加しましたか?)が、チェックしてみてください
print os.path.isdir(os.path.join('C:','Users','nookie'))
。
これがTrue
の場合、os
は混合スラッシュに対して機能します。
どちらにしても、ディレクトリ名をプログラムにハードコーディングすることは避けたいです。 _sys.path
_ forループは、これらのディレクトリを取り出す安全な方法です。次に、いくつかの文字列メソッドまたは正規表現を使用して、目的のフォルダを選択できます。