2013-07-10 2 views
2

저는 파이썬을 사용하여 크로스 플랫폼 경로 교환을 수행하고 있습니다.크로스 플랫폼 경로 교환

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이 제거되기 전에 ... 어떻게하면됩니까? 당신은 단지 그것을 할 경우 :

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

어떻게이 질문이 명확합니까? 그것은 아주 분명합니다. 제목은 오해의 소지가 있습니다. –

+1

마지막 문장에서 무엇을 의미합니까? – Mark

+0

내 생각에 그는/Volumes/projects가 없으면 볼륨을 제거했지만 볼륨/프로젝트는 슬래시없이 제거했음을 알 수 있습니다. – Nicolas78

답변

1

파이썬은, 당신이 생각하는 것보다 훨씬 낫다. 따라서 모든 위치에서 /을 사용하면 \ 문자를 사용하여 이스케이프 문제를 제거하는 데 도움이됩니다.

다른 시스템에서 실행 중이거나 다르게 작동하는 시스템 (예 : 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__)) 
+1

OP는'filenameFix()'함수를 원하므로 input은 이미 디렉토리가 들어있는 파일 이름입니다. – Alfe

+0

사실,이 코드의 환경에 대한 잘못된 가정이 있습니다. (기본적으로, 문자열을 작성하는 대신 이러한 함수를 사용하여 처음에는 적절한 파일 이름을 만들지 만 작동하지 않습니다. 파일 이름이 다른 곳에서 온 경우). – Nicolas78

2

윈도우 앞으로이 경로에 슬래시 지원하고, 그래서 리눅스를 수행

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

모든 답장을 보내 주셔서 감사합니다. :-) 내가 겪고있는 한 가지 다른 문제는 경로를 번역 할 때입니다 ... 나는 경로를 해결할 수 없으므로 문제의 원인이되는 선도적 인 슬래시 (예 :/p : /)를 얻습니다. 이것은/volumes/projects에서만 발생합니다. – 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

감사합니다 ....이 작업은/Volumes/projects 및 Volumes/projects 모두의 파일 이름을 바꿉니다. 프로젝트. 그러나/volumes/projects를 대체 할 때 p :/앞에 슬래시가 삽입됩니다. 어떤 아이디어? – ash

+0

홀수.두 개의 체인 대체 명령을 바꾼 경우 (예 : Volumes /.../를 사용하고 초기 /를 그대로두면) 예상되는 동작과 유사합니다. – Nicolas78