Python 跨平台路径交换
我正在使用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
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