Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 跨平台路径交换_Python - Fatal编程技术网

Python 跨平台路径交换

Python 跨平台路径交换,python,Python,我正在使用python进行一些跨平台的路径交换 import platform def filenameFix(filename): if platform.system() in ("Windows", "Microsoft"): return filename.replace ( "/Volumes/projects/", "p:/") else: return filename.replace( "p:/", "/Volumes/proj

我正在使用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/
的路径,但是我希望它也可以在第一个if块中交换
Volumes/projects
的路径。唯一的区别是删除
之前的正斜杠。。。我怎样才能做到这一点呢?

如果您愿意,Python对您来说比您想象的要好得多:)


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__))

您可以在不使用前导的
/
的情况下进行替换,然后删除可能存在的任何前导的
/

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/'

我想知道这是否比我最初的回答更能回答你的问题。。。如果第一次替换失败,请查找相同的模式,但不带斜线

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

这个问题怎么不清楚?非常清楚。标题有误导性。最后一句话的意思是什么?你能告诉我们发生了什么吗?我认为他想要删除/卷/项目,如果在那里,但是卷/项目没有斜杠,如果在那里,但是有点离题,因为OP想要一个
filenameFix()
函数,因此输入是一个已经包含目录的文件名。没错,我对这段代码的环境做了一些假设,这些假设可能是错误的(基本上,我的观点是,不要构建字符串,而是首先使用这样一个函数来创建一个正确的文件名,但是如果文件名来自其他地方,这就行不通了).谢谢您的回复。:-)我正在经历的另一个问题是,当它转换路径时。。。我得到一个前导正斜杠,例如/p:/,这会导致问题,因为它无法解决路径问题。这只发生在/卷/项目上。@ash是的,我是个白痴。。我忘了额外的斜杠应该在字符串的开头,而不是
p://
之后。现在全部修复。@ash现在使用.lstrip('/')查看解决方案。@ash不应该。看看我写的例子。@Josh…..很有魅力…谢谢你,我想这需要一个正则表达式;)谢谢……这很有效,它同时替换了/Volumes/projects和Volumes/projects的文件名。但是,在替换/volumes/projects时,会在p:/之前插入正斜杠。有什么想法吗?奇怪。听起来像是交换两个链式replace命令时所期望的行为(因为它将接受卷/../并保留初始/)-它们是否有可能被交换?不,不是交换,它将卷/项目的路径正确地交换到p:/,但将/Volumes/项目的路径交换到/p:/。
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