web-dev-qa-db-ja.com

PythonのWindowsパス

"C:\meshes\as"など、Windowsディレクトリを表す最良の方法は何ですか?スクリプトを変更しようとしていましたが、ディレクトリを正しく取得できないために機能しません。エスケープ文字として'\'が機能しているためだと思いますか?

102
Gareth

常に使用できます:

'C:/mydir'

これは、LinuxとWindowsの両方で機能します。その他の可能性は

'C:\\mydir'

名前に問題がある場合は、生の文字列リテラルを試すこともできます。

r'C:\mydir'

ただし、ベストプラクティスは、OSの正しい構成を常に選択するos.pathモジュール関数を使用することです。

os.path.join(mydir, myfile)

python 3.4から pathlib モジュールを使用することもできます。これは上記と同等です。

pathlib.Path(mydir, myfile)

または

pathlib.Path(mydir) / myfile
163
joaquin

os.pathモジュールを使用します。

os.path.join( "C:", "meshes", "as" )

または生の文字列を使用する

r"C:\meshes\as"
13
S.Lott

はい、Python文字列リテラルの\は、エスケープシーケンスの開始を示します。パスには、有効な2文字のエスケープシーケンス\aがあります。これは、one文字- ASCII Bell

>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess

他の一般的なエスケープシーケンスには、\t(タブ)、\n(ラインフィード)、\r(キャリッジリターン)が含まれます。

>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']

ご覧のとおり、これらのすべての例で、リテラルのバックスラッシュと次の文字がグループ化されて、最終的な文字列に単一の文字が形成されています。 Pythonのエスケープシーケンスの完全なリストは here です。

それに対処するには、さまざまな方法があります。

  1. PythonはrまたはRで始まる文字列リテラルのエスケープシーケンスを処理しません

    >>> r'C:\meshes\as'
    'C:\\meshes\\as'
    >>> print(r'C:\meshes\as')
    C:\meshes\as
    
  2. Windows上のPythonもスラッシュを処理する必要があります。

  3. os.path.join ...を使用できます.

    >>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'
    
  4. ...または新しい pathlib module

    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    
12
vaultah