web-dev-qa-db-ja.com

Python Windowsのos.path.join

pythonを学ぼうとしています。スクリプトを出力するプログラムを作成しています。os.path.joinを使用したいのですが、かなり混乱しています。 docs 私が言う場合:

os.path.join('c:', 'sourcedir')

"C:sourcedir"を取得します。ドキュメントによると、これは正常ですよね?

ただし、copytreeコマンドを使用すると、Pythonは次のように希望する方法で出力します。

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)

ここに私が得るエラーコードがあります:

 WindowsError:[エラー3]指定されたパスが見つかりません: 'C:src /*.*'

os.path.joinos.path.normpathでラップすると、同じエラーが発生します。

このos.path.joinをこの方法で使用できない場合、その目的に関して混乱しています。

Stack Overflowが推奨するページによると、スラッシュを結合に使用すべきではありません。それは正しいと思いますか?

78
Frank E.

Windowsには、各ドライブの現在のディレクトリという概念があります。そのための、 "c:sourcedir"は、現在のC:ディレクトリ内の「sourcedir」を意味し、絶対ディレクトリを指定する必要があります。

これらのいずれも機能し、同じ結果が得られるはずですが、Windows VMを再確認するために現時点で起動していません:

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")
49
Roger Pate

さらに独創的であるために、最もpython doc一貫性のある答えは次のようになります。

mypath = os.path.join('c:', os.sep, 'sourcedir')

Posixルートパスにはos.sepも必要なので、

mypath = os.path.join(os.sep, 'usr', 'lib')
107
AndreasT

os.path.join('C:', 'src')が期待どおりに機能しない理由は、リンク先のドキュメントに何かがあるためです。

Windowsでは、各ドライブに現在のディレクトリがあるため、os.path.join( "c:"、 "foo")は、cではなくドライブC:(c:foo)の現在のディレクトリからの相対パスを表します。 :\ foo。

Ghostdogが言ったように、おそらくmypath=os.path.join('c:\\', 'sourcedir')

11
Smashery

面白くするために、パス区切り文字として/または\のいずれかをハードコードすることはおそらく良くありません。たぶんこれがベストでしょうか?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')

または

mypath = os.path.join('c:' + os.sep, 'sourcedir')
10
Matt Ball

これは(windows)pythonバグだと思います。

なぜバグなのか?

このステートメントはTrueにすべきだと思います

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))

しかし、WindowsマシンではFalseです。

5
georg

WindowsとLinuxの両方で動作するシステムに依存しないソリューションの場合、入力パスに関係なく、os.path.join(os.sep, rootdir + os.sep, targetdir)を使用できます。

Windowsの場合:

>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'

Linuxの場合:

>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'
5
Scott Gigante

windowsパスに参加するには、試してください

mypath=os.path.join('c:\\', 'sourcedir')

基本的に、スラッシュをエスケープする必要があります

3
ghostdog74

Windowsでパスを扱うには、最もハードコーディングされたもの(生の文字列リテラルの使用やバックスラッシュのエスケープなど)から最小のものまで、いくつかの可能なアプローチがあります。以下に、期待どおりに機能するいくつかの例を示します。ニーズに合ったものを使用してください。

In[1]: from os.path import join, isdir

In[2]: from os import sep

In[3]: isdir(join("c:", "\\", "Users"))
Out[3]: True

In[4]: isdir(join("c:", "/", "Users"))
Out[4]: True

In[5]: isdir(join("c:", sep, "Users"))
Out[5]: True
3
Marco Gomez

@ georg-の同意

なぜラメが必要なのかos.path.join- str.join または unicode.join例.

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))
0
SIslam