PythonのLinuxとWindowsの両方で「/」(ディレクトリ区切り)を使用するにはどうすればよいですか?


191

/を使用してフォルダー内に特定のファイルを作成するコードをPythonで記述しました。Windowsでコードを使用したい場合、機能しません。WindowsおよびLinuxでコードを使用する方法はありますか。

Pythonでは私はこのコードを使用しています:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

Windowsマシンでコードを使用すると、コードが機能しなくなります。

LinuxとWindowsの両方で「/」(ディレクトリ区切り)を使用するにはどうすればよいですか?


1
Win / * nixに応じて最初に定義してから、変数を操作できます。
fedorqui 'SO stop harming' 2013

12
Windowsでは、\または/をディレクトリ区切り文字として使用できます。
SecurityMatt

12
Windowsでは/、ディレクトリパスをサポートしています。どのような問題がありますか?問題を説明するコードを投稿してください。
Michael Geary

Windowsユーザースペースプログラムに依存していない限り、スラッシュは逆方向にも機能します。ただし、一部のcmdコマンドには問題があります。
ピハン2013

1
@Mehrdad:Win32 APIが '/'を受け入れない例を知っていますか?(cmd.exeと他のプログラムは数えません)
Eryk Sun

回答:


266

を使用しos.path.join()ます。例:os.path.join(pathfile,"output","log.txt")

あなたのコードでは: rootTree.write(os.path.join(pathfile,"output","log.txt"))


8
os.path.joinより複雑なロジックを使用して、いくつかの相対パスコンポーネントを一致させます。それらをチェーンしたい場合os.sep.joinは、正しい選択です。
Bachsau

108

使用する:

import os
print os.sep

現在のOSでセパレータがどのように見えるかを確認します。
あなたのコードではあなたが使うことができます:

import os
path = os.path.join('folder_name', 'file_name')


38

os.path.normpath(pathname)Windowsで/パス区切り文字を\区切り文字に変換するため、これについても言及する必要があります。また、冗長な上位レベルの参照...すなわち崩壊、A/BそしてA/foo/../BそしてA/./BすべてになりますA/B。そして、あなたがWindowsなら、これらはすべてになりA\Bます。


3
これは、「LinuxとWindowsの両方で「/」(ディレクトリ区切り文字)を使用する方法」と言われていた質問に対するIMOの最良の回答です。また、これも非常に便利です。長いパスを指定する必要os.path.normpath('a/b/c/d/file.ext')があるos.path.join('a','b','c','d','file.ext')ときよりも、むしろやりたいと思っています。
ukrutt

また、この回答は非常に役に立ちました。一貫したセパレータを使用してパスを生成する方法を探していました。有名人はos.path.join提供されたものすべてに参加します。たとえばjoin("a/b", "c\d")a/b\c\d(Windows上で)与えます。しかし、私はjoinand の適切な組み合わせで期待どおりの結果を得ることができますnormpath。たとえばa\b\c\d(Windowsの場合)
Sumudu

17

幸運にもPython 3.4以降を実行できる場合は、次のコマンドを使用できますpathlib

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

または同等に、

path = Path(dir) / subdir / filename

16

あなたを助けるいくつかの便利なリンク:


2
パスセップ?一般的には便利ですが、IMOはここではありません。
glglgl 2013

2
@glglgl確かに。私も探しましたsepが、これも投稿するのに抵抗できませんでした(OPが今後の作業に役立つと思いました):)
Maroun


8

os.sep」を使用できます

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)

4

ディレクトリやファイル名を自分で構築するのではなく、Pythonに含まれるライブラリを使用してください。

この場合、関連するのはos.pathです。特に、ディレクトリとファイル名またはディレクトリから新しいパス名を作成し、フルパスからファイル名を取得するスプリットを結合します。

あなたの例は

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.