34

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

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

4

3 に答える 3

40

を使用し、ユーザーのホームディレクトリに関連するファイル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
于 2012-10-31T16:34:42.490 に答える
0

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

>>> import os
>>> os.path.join('app', 'subdir', 'dir', 'filename.foo')
'app/subdir/dir/filename.foo'
于 2012-10-31T16:20:17.363 に答える