2017-07-25 132 views
1

是否有一個Python庫需要一個Windows路徑並用環境變量替換擴展的環境變量?使用環境變量將Windows路徑轉換爲路徑

例如:

C:\Users\Username\Documents\Text.txt -> %USERPROFILE%\Documents\Text.txt 
C:\Windows\System32\cmd.exe -> %WINDIR%\System32\cmd.exe 
C:\Program Files\Program\Program.exe -> %PROGRAMFILES%\Program\Program.exe 

解釋將獲得的功能,確實

os.path.expandvars('some path with environment variables') 

支持不同語言的對面也將是一個需求的最佳途徑。

C:\Archivos de programa\Progra\Program.exe -> %PROGRAMFILES%\Program\Program.exe 
+2

我不認爲這是可能的,或者至少是曖昧。沒有什麼可以說目錄與環境變量是一對一的映射。換句話說,我可以將'%FOO%'和'%BAR%'都擴展爲'C:\ Windows',在這種情況下,我應該使用哪種? – CoryKramer

+0

有一個['winshell'](https://winshell.readthedocs.io/)模塊,特別是它的[Special Folders](https://winshell.readthedocs.io/en/latest/special-folders.html)抓住一些特殊文件夾的部分。其餘的你必須使用Win32 API。然後,它只是檢查你的路徑是否與特殊文件夾相交,並用規範的_environment variable_ name替換 - 你可以使用'os.path'設備。 – zwer

+0

@CoryKramer它只需要映射到已知的默認Windows環境變量,而不是任何新的。 –

回答

1

這是一個不平凡的問題,因爲超過環境變量可以匹配你的部分字符串(例如:PROCESSOR_LEVEL通常是一個單一的數字,所以你應該避免)。爲了確保最佳的效率,我想:

  • 排序現有的環境變量l

這樣的:

import os 

my_string = os.path.normpath(r"D:\Users\JOTD\AppData\Roaming\Adobe\Flash Player") 


for k,v in sorted(os.environ.items(),key=lambda x:len(x[1]),reverse=True): 
    my_new_string = my_string.replace(v+os.sep,"%{}%{}".format(k,os.sep)) 
    if my_string != my_new_string: 
     break 
    my_string = my_new_string 

print(my_new_string)