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

这可以很好地交换路径/Volumes/projects/,但是我希望它也可以Volumes/projects在第一个 if 块中交换路径。唯一的区别是之前的正斜杠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 回答