2013-07-10 132 views
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。唯一的區別是Volumes已被刪除之前的斜線......我怎麼能這樣做?

+1

這個問題怎麼不清楚?這很清楚。標題雖然有誤導性。 –

+1

你是什麼意思與最後一句話,你可以告訴我們會發生什麼 – Mark

+0

我認爲他希望/卷/項目刪除,如果在那裏,但卷/項目刪除沒有斜線,如果在那裏 – Nicolas78

回答

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) 
+1

但有點偏離主題,因爲OP需要一個'filenameFix()'函數,所以輸入是一個已經包含目錄的文件名。 – Alfe

+0

的確,我對這段代碼的環境做了一些假設,可能是錯誤的(基本上,我的觀點是,而不是構建該字符串,首先使用這樣的函數來創建合適的文件名,但這不起作用如果文件名來自別處)。 – Nicolas78

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__)) 
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/' 
+0

感謝所有答覆。 :-)另一個我遇到的問題是,當它翻譯路徑時......我得到了一個前導斜槓eg/p:/,這導致了問題,因爲它無法解析路徑。這隻發生在/卷/項目。 – ash

+0

@ash是的,我是一個白癡..我忘了額外的斜槓將在字符串的開始,而不是'p:/'後面。現在全部修好了。 –

+0

@ash現在使用.lstrip('/')看到解決方案 –

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 
+1

我想這是要求RegEx;) – Nicolas78

+0

謝謝....這工作,它取代文件名爲/卷/項目和卷/項目。然而,當替換/卷/項目時,它會在p:/之前插入正斜槓。有任何想法嗎? – ash

+0

奇數。聽起來像是如果交換兩個鏈接替換命令時會出現的行爲(因爲它會佔用Volumes /.../並保留最初的/) - 任何它們被交換的機會? – Nicolas78