PythonでのWindowsパス


152

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

回答:


220

いつでも使用できます:

'C:/mydir'

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

'C:\\mydir'

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

r'C:\mydir'

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

os.path.join(mydir, myfile)

Python 3.4以降では、pathlibモジュールも使用できます。これは上記と同等です:

pathlib.Path(mydir, myfile)

または

pathlib.Path(mydir) / myfile

2
@Gareth、私はとても怠惰で、しばしば '/'を使用していることに気づきました。ただし、長期的にはos.pathを使用する方が便利です。また、mydirとmyfileを変数として使用して、簡単に変更できます。
joaquin

13
生の文字列で注意すべき唯一のことは、それらを\で終わらせることができないということです
ダグラスリーダー

os.path.join()を使用して、パスを\で終了する必要をなくすことができます。
Edigerは2014

1
私はr(生の文字列)構文が好きです。通常、すべてのバックスラッシュをフォワードスラッシュに置き換える必要がある長いパスをコピーする場合に便利です
peterb

生の文字列は\\で終了できるため、次のパスにファイルを連結できます:codecs.open(r "C:\ maXbox \ EKON24 \ tweet_data \\" + file、 'r'、encoding = 'utf-8')as f:
マックスクライナー

20

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

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

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

r"C:\meshes\as"

パスやファイル名にスペースを入れないこともお勧めします。また、文字列に二重のバックスラッシュを使用できます。

"C:\\meshes\\as.jpg"

11
os.path.joinは、相対パスが許可されているため、コンポーネントがドライブ文字の場合、期待どおりに動作しない場合があります。(Windowsでは、最初の行の結果は「C:meshes \\ as」です。)
dash-tom-bang

@ dash-tom-bangのコメントは本当に重要です。"C:\"最初のエントリーとして置くのは正しいことですか?それは使用の清潔さのいくつかを台無しにしていjoinますか?
ジャック・オコナー14

1
@ JackO'Connorそれが私がすることです。あなたは確かに"C:\"ファイル名の真ん中に入れたくないでしょう。さらに、os.path.normpath結合の前または後に使用して、パスが適切に印刷されることを確認できます。
Agostino

しかし、それも機能しません。どのような作品はあるos.path.join( "C:\\", "meshes", "as" )
ジャン=フランソワ・ファーブル

17

はい。Pythonでは\、文字列リテラルはエスケープシーケンスの開始を示します。パスに有効な2文字のエスケープシーケンスがあり\aASCIIベルである1文字に折りたたまれています。

>>> '\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のエスケープシーケンスの完全なリストはこちらです。

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

  1. Pythonは、rorで始まる文字列リテラルのエスケープシーケンスを処理しません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モジュール

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

-1

PowerShellを使用する

Windowsでは、使用できる/すべての場所でちょうどLinuxやMacOSのようなあなたのパスにあなたはPowerShellを使用する限り、あなたのコマンドラインインターフェイスとして。それは来るプリインストールのWindows上で、それは多くのサポート、Linuxのコマンドのようなlsコマンドを使用します。

Windowsコマンドプロンプト(cmdWindowsスタートメニューに入力したときに表示されるコマンドプロンプト)を使用する場合は、\その中にパスを指定する必要があります。/他のすべての場所(コードエディター、Pythonインタラクティブモードなど)でパスを使用できます。


-1

他のソース(たとえば、ファイルエクスプローラー)からWindowsパスを貼り付けたい場合input()は、Pythonコンソールの呼び出しを介して行うことができます。

>>> input()
D:\EP\stuff\1111\this_is_a_long_path\you_dont_want\to_type\or_edit_by_hand
'D:\\EP\\stuff\\1111\\this_is_a_long_path\\you_dont_want\\to_type\\or_edit_by_hand'

次に、結果をコピーします

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