7

私は Python が大好きです。なぜなら、バッテリーが含まれているからです。また、組み込み関数を頻繁に使用して、汚い仕事をしてくれます。

私は常に os.path モジュールを使用してファイル パスを処理してきましたが、最近、Windows ファイル パスを表す文字列を処理しているときに、Ubuntu Linux で Python 2.5 で予期しない結果が発生しました。

filepath = r"c:\ttemp\FILEPA~1.EXE"
print os.path.basename(filepath)
'c:\\ttemp\\FILEPA~1.EXE']
print os.path.splitdrive(filepath)
('', 'c:\ttemp\\FILEPA~1.EXE')

なに?

filepath = u"c:\ttemp\FILEPA~1.EXE" と filepath = "c:\ttemp\FILEPA~1.EXE" で同じように終了します。

手がかりはありますか?Ubuntu は UTF8 を使用しますが、それと関係があるようには感じません。私のPythonのインストールが台無しになっているのかもしれませんが、私が覚えている特定の微調整は行っていません。

4

3 に答える 3

26

Linux で Windows パスを操作したい場合は、ntpath モジュールを使用する必要があります (これは、Windows では os.path としてインポートされるモジュールです - posixpath は Linux では os.path としてインポートされます)。

>>> import ntpath
>>> filepath = r"c:\ttemp\FILEPA~1.EXE"
>>> print ntpath.basename(filepath)
FILEPA~1.EXE
>>> print ntpath.splitdrive(filepath)
('c:', '\\ttemp\\FILEPA~1.EXE')
于 2008-10-08T12:11:55.803 に答える
4

os.pathドキュメントから:

os.path.splitdrive(path)
パス名 path をペア (ドライブ、テール) に分割します。ここで、ドライブはドライブ指定または空の文字列です。ドライブ指定を使用しないシステムでは、ドライブは常に空の文字列になります。いずれの場合も、ドライブ + テールはパスと同じになります。

これを unix で実行する場合、ドライブ仕様を使用しないため、- ドライブは空の文字列になります。

任意のプラットフォームで Windows パスを解決したい場合は、単純な正規表現を使用できます。

import re
(drive, tail) = re.compile('([a-zA-Z]\:){0,1}(.*)').match(filepath).groups() 

driveドライブ文字の後に:(例: c:, u:) またはNone, とtail残り全体 :)

于 2008-10-08T11:38:57.697 に答える
1

具体的には、こちらのドキュメントを参照してください。

splitdrive(p) パス名をドライブとパスに分割します。Posix では、ドライブは常に空です。

したがって、これは Linux ボックスでは機能しません。

于 2008-10-08T11:39:03.780 に答える