2

私はPythonを使用して、クロスプラットフォームのパススワッピングを行っています。

import platform 

def filenameFix(filename):
    if platform.system() in ("Windows", "Microsoft"):
        return filename.replace ( "/Volumes/projects/", "p:/")
    else:
        return filename.replace( "p:/", "/Volumes/projects/" )
    return filename

これは のパスを交換するのにうまく機能しますが、最初の if ブロックの/Volumes/projects/パスも交換したいです。Volumes/projects唯一の違いは、前のスラッシュVolumesが削除されていることです...どうすればこれを行うことができますか?

4

4 に答える 4

2

Windows はパスのスラッシュをサポートしており、Linux もサポートしています。したがって、すべての場所で使用できるため、キャラクター/を使用してエスケープする際の問題を解決するのにも役立ちます.\

それが機能しない場合、または他のシステム、または動作が異なるシステム (Mac など) でも実行している場合。次に、使用できますos.path.join()

または、これを使用できます:

import sys

def get_path(filename):
    if sys.platform == 'win32':
        return filename.replace("/Volumes/projects/", "p:/")
    else:
        return filename.replace("p:/", "/Volumes/projects/")

ベストプラクティスは、パスの「ルート」要素をハードコーディングせず、代わりにos.getenv('HOME')またはそのような定数を使用して相対的に取得するか、実行中のスクリプトの相対パスを取得し、それからディレクトリツリーを構築することです。 :

this_dir = os.path.dirname(os.path.abspath(__file__))
于 2013-07-10T10:50:36.053 に答える
1

Pythonは、あなたが思っているよりもはるかに優れています:)

import os.path

def get_dir():
    return "p:/" if platform.system() in ("Windows", "Microsoft") else "..."

def full_filename(filename):
    return os.path.join(get_dir(), filename)
于 2013-07-10T10:49:32.390 に答える
0

これは実際に私の最初の回答よりもあなたの質問にうまく答えるのだろうか...最初の置換が失敗した場合は、同じパターンを探しますが、スラッシュはありません.

def filenameFix(filename):
    if platform.system() in ("Windows", "Microsoft"):
        return filename.replace ( "/Volumes/projects/", "p:/").replace("Volumes/projects/", "p:/")
    else:
        return filename.replace( "p:/", "/Volumes/projects/" )
    return filename
于 2013-07-10T11:11:55.577 に答える
0

先頭の なしで置換を実行してから、存在する可能性のある/先頭を削除する/ことができます。

import platform 

def filenameFix(filename):
    if platform.system() in ("Windows", "Microsoft"):
        return filename.replace( "Volumes/projects/", "p:/").lstrip('/')
    else:
        return filename.replace( "p:/", "/Volumes/projects/" )
    return filename

>>> s1
'/Volumes/projects/blah/'
>>> s2
'Volumes/projects/blah/'
>>> s1.replace('Volumes/projects/', 'p:/').lstrip('/')
'p:/blah/'
>>> s2.replace('Volumes/projects/', 'p:/').lstrip('/')
'p:/blah/'
于 2013-07-10T10:56:55.400 に答える