web-dev-qa-db-ja.com

Windowsでのos.path.joinとの混合スラッシュ

私はパスにスラッシュのみを使用する傾向があり( '/')、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
51
nookie

スラッシュの一部を自分で指定し、 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の場合、パスのルートにセパレーターを含める必要があります。それ以外の場合は、絶対パスではなく相対パスを作成します。

29
pyrocumulus

.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が示唆したように、入力文字列からスラッシュを削除する方が良いでしょうが、これは代替手段です。

34
Maximus

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で終了しました

10
Andre Odendaal

コメントに基づく編集: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)
    
8
oriadam

何らかの理由でパスを自分で提供する必要があり、上記の何かを使用している場合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')
2
dinosaurwaltz

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ループは、これらのディレクトリを取り出す安全な方法です。次に、いくつかの文字列メソッドまたは正規表現を使用して、目的のフォルダを選択できます。

2
ejrb