110

私はPythonを学ぼうとしていて、スクリプトを出力するプログラムを作成しています。os.path.joinを使いたいのですが、かなり混乱しています。私が言うならば、ドキュメントによると:

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によって提案されたページによると、結合にスラッシュを使用するべきではありません。それは正しいと思いますか?

4

11 に答える 11

140

さらに衒学的であるために、最もpythondocの一貫した答えは次のようになります:

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

posixルートパスにもos.sepが必要なので、次のようにします。

mypath = os.path.join(os.sep, 'usr', 'lib')
于 2011-10-14T12:56:25.503 に答える
70

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

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

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")
于 2010-03-11T05:52:34.950 に答える
16

衒学的であるために、パス区切り文字として/または\のいずれかをハードコーディングすることはおそらく良くありません。多分これは最高でしょう?

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

また

mypath = os.path.join('c:' + os.sep, 'sourcedir')
于 2011-09-15T17:56:29.007 に答える
14

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

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

ゴーストドッグが言ったように、あなたはおそらく欲しいmypath=os.path.join('c:\\', 'sourcedir')

于 2010-03-11T05:47:30.187 に答える
14

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'
于 2018-07-11T01:56:37.310 に答える
7

これは(Windows)Pythonのバグだと思います。

なぜバグ?

この声明はTrue

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

しかし、それはFalseWindowsマシン上にあります。

于 2013-07-01T08:09:41.353 に答える
5

Windowsパスに参加するには、

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

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

于 2010-03-11T05:45:09.800 に答える
4

最もハードコードされたもの(生の文字列リテラルを使用したり、バックスラッシュをエスケープしたりするなど)から最小のものまで、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
于 2017-10-30T21:21:44.247 に答える
1

@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))
于 2016-03-19T09:49:43.127 に答える
0

コメントへの回答:「その他の'//''c:'、'c:\\'は機能しませんでした(C:\\は2つの円記号を作成し、C:\はまったく機能しませんでした) "

Windowsでは、を使用 すると、 sourcedirの前にos.path.join('c:', 'sourcedir') 2つの円記号が自動的に追加されます。\\

パスを解決するには、Pythonはスラッシュも使用してWindowsで動作するため、-> '/'、以下のように追加.replace('\\','/')するだけですos.path.join:-

os.path.join('c:\\', 'sourcedir').replace('\\','/')

例えば:os.path.join('c:\\', 'temp').replace('\\','/')

出力:'C:/ temp'

于 2020-02-04T17:14:53.037 に答える
0

提案されたソリューションは興味深いものであり、優れたリファレンスを提供しますが、部分的にしか満足できません。特定のケースが1つある場合、または入力文字列の形式がわかっている場合は、セパレータを手動で追加してもかまいませんが、一般的な入力に対してプログラムで追加したい場合があります。

少し実験してみると、最初のセグメントがドライブ文字の場合、つまり、実際の単位に対応するかどうかに関係なく、1文字の後にコロンが続く場合、パス区切り文字は追加されないという基準があると思います。

例えば:

import os
testval = ['c:','c:\\','d:','j:','jr:','data:']

for t in testval:
    print ('test value: ',t,', join to "folder"',os.path.join(t,'folder'))
test value:  c: , join to "folder" c:folder
test value:  c:\ , join to "folder" c:\folder
test value:  d: , join to "folder" d:folder
test value:  j: , join to "folder" j:folder
test value:  jr: , join to "folder" jr:\folder
test value:  data: , join to "folder" data:\folder

基準をテストしてパス修正を適用する便利な方法はos.path.splitdrive、最初に返された要素をのようなテスト値と比較することt+os.path.sep if os.path.splitdrive(t)[0]==t else tです。

テスト:

for t in testval:
    corrected = t+os.path.sep if os.path.splitdrive(t)[0]==t else t
    print ('original: %s\tcorrected: %s'%(t,corrected),' join corrected->',os.path.join(corrected,'folder'))
original: c:    corrected: c:\  join corrected-> c:\folder
original: c:\   corrected: c:\  join corrected-> c:\folder
original: d:    corrected: d:\  join corrected-> d:\folder
original: j:    corrected: j:\  join corrected-> j:\folder
original: jr:   corrected: jr:  join corrected-> jr:\folder
original: data: corrected: data:  join corrected-> data:\folder

おそらく、トレーリングスペースに対してより堅牢になるように改善することができます。私はウィンドウでのみテストしましたが、アイデアが得られることを願っています。Os.pathも参照してください:この動作を説明できますか?Windows以外のシステムの興味深い詳細については。

于 2020-02-08T19:02:24.037 に答える