web-dev-qa-db-ja.com

pythonを使用したWindowsでの絶対UNIXパスの使用

Blobファイルをハードドライブに保存するアプリケーションを作成していますが、このスクリプトはLinuxとWindowsの両方で実行する必要があります。問題は、プロジェクトファイルに対する相対パスではなく、ファイルシステムルートからの絶対パスを指定することです。これは、gitを使用していて、これらすべてのファイルを同期から除外することに対処したくないためです。

だから私はこのようなものを持っていると思います:

path = '/var/lib/blob_files/'
file = open(path+'myfile.blob', 'w')

そして、UNIXでファイルを取得します:

/var/lib/blob_files/myfile.blob

そしてウィンドウで:

C:\var\lib\blob_files\myfile.blob

ユーザーのホームフォルダー(UNIXでは/ home/user、WindowsではC:/ Users/User)に関連する場合もありますが、問題は非常に似ていると思います。

どうすればこれを達成できますか?常に実行しているスクリプトがどのプラットフォームにあるかを尋ねずに、このパスを透過的に変換するのに役立つライブラリまたは関数はありますか?

ルートからの絶対またはホームフォルダーからの相対の2つのオプションのうち、どちらを使用することをお勧めしますか?

これに関するアドバイスを事前にありがとう

26
jeruki

ユーザーのホームディレクトリに関連するファイルには、os.path.abspath()、およびos.path.expanduser()を使用します。

_print os.path.abspath("/var/lib/blob_files/myfile.blob")
>>> C:\var\lib\blob_files\myfile.blob

print os.path.abspath(os.path.expanduser("~/blob_files/myfile.blob"))
>>> C:\Users\jerry\blob_files\myfile.blob
_

これらは、WindowsとPOSIXの両方のパスで「正しいこと」を行います。

_~_が含まれていない場合、expanduser()はパスを変更しないため、すべてのパスで安全に使用できます。したがって、ラッパー関数を簡単に作成できます。

_import os
def fixpath(path):
    return os.path.abspath(os.path.expanduser(path))
_

使用されるドライブ文字は、Pythonプロセスの現在の作業ディレクトリによって指定されたドライブであり、通常はスクリプトが存在するディレクトリです(Windowsエクスプローラーから起動し、スクリプトが想定していない場合)。それを常に_C:_にしたい場合は、次のようにすることができます。

_import os
def fixpath(path):
    path = os.path.normpath(os.path.expanduser(path))
    if path.startswith("\\"): return "C:" + path
    return path
_
32
kindall

わかりました、私は自分で答えを得ました。

os.path.exists(os.path.abspath(filePath))

多分それは誰にとっても役に立つでしょう

2
Snorlax

プラットフォームに依存しないファイルパス? でのBlenders応答から==

>>> import os
>>> os.path.join('app', 'subdir', 'dir', 'filename.foo')
'app/subdir/dir/filename.foo'
1
dm03514