2009-08-31 1 views
4

Windows 환경에서 만들었지 만 Linux에 배포 된 일부 XML 구성 파일이 있습니다. 이 구성 파일은 파일 경로로 서로를 참조합니다. 이전에 대/소문자 구분 및 후행 공백에 대한 문제가 있었으며이 문제를 확인하는 스크립트를 작성하고 싶습니다. 도움이된다면 Cygwin을 사용합니다.Windows에서 파일 이름의 대소 문자가 일치하지 않음 (가급적이면 파이썬 사용)?

:

예 : 우리가 실수하여이 작업을 수행 할 경우

의 내가 파일 foo는/바/baz.xml에 대한 참조가 있다고 가정 해 봅시다, 내가 지금이

<someTag fileref="foo/bar/baz.xml" /> 

을 할 거라고

<someTag fileref="fOo/baR/baz.Xml " /> 

여전히 Windows에서 작동하지만 Linux에서는 작동하지 않습니다.

내가 원하는 것은 이러한 파일의 파일 참조가 대소 문자를 구분할 때 실제 파일과 일치하지 않는 경우를 감지하는 것입니다.

+0

이렇게 실수로 끝나는 방법이 명확하지 않습니다. 이 값들을 하드 코딩하고 있습니까? – SilentGhost

답변

3

os.listdir, 모든 경우 보존 파일 시스템에서 : 그러나만큼 당신이 어떤 합리적인 규칙을 (모든 파일 이름 예를 들어, 소문자입니다) 가지고, 기존의 파일을 확인하기 위해 사소한 것 (Windows의 경우 포함), 나열한 디렉토리의 파일 이름에 대한 실제 대소 문자를 반환합니다.

그래서 당신은 경로의 각 레벨에서이 검사를 할 필요가 : 나는 이름의 경우 변화의 완전한 부재가 오류의 다른 종류라고 가정하고, 사용하고

def onelevelok(parent, thislevel): 
    for fn in os.listdir(parent): 
    if fn.lower() == thislevel.lower(): 
     return fn == thislevel 
    raise ValueError('No %r in dir %r!' % (
     thislevel, parent)) 

그 예외; foo/bar가 아닌 foo을 의미주의해야 할, 당신은 예를 들어, 경우이 적응해야 할 수도 있습니다

def allpathok(path): 
    levels = os.path.split(path) 
    if os.path.isabs(path): 
    top = ['/'] 
    else: 
    top = ['.'] 
    return all(onelevelok(p, t) 
      for p, t in zip(top+levels, levels)) 

:와, 전체 경로 (어쨌든 Windows로 번역하지 않을에는 드라이브 문자 또는 UNC 없다고 가정) 현재 디렉토리에 있지만 다른 위치에 있습니다. 물론, UNC 나 드라이브 편지가 실제로 필요하다면 (하지만 필자가 리눅스로 번역 한 내용은 어쨌든 사소한 것이 아닙니다 .-)).

구현 참고 사항 : zip은 지퍼 링 시퀀스의 가장 짧은 길이를 초과하여 "추가 항목"을 드롭한다는 점을 이용합니다. 그래서 나는 명시 적으로 첫 번째 인자 인 levels에서 "leaf"(마지막 엔트리)를 잘라 낼 필요가 없다. zip은 나를 대신한다. all은 가능한 한 단락 회로를 구성하여 거짓 값을 감지하자마자 False을 반환하므로 명시 적 루프만큼 좋지만 빠르고 정확합니다.

+0

나는 이런 식으로해야한다고 생각했다. foo/bar/baz.xml이 현재 디렉토리와 관련이 없으므로 약간 수정해야합니다. 가능한 최상위 경로의 (작은) 수에 상대적입니다. –

0

정확하게 문제를 판단하기는 어렵지만 파일 이름을 저장하기 전에 os.path.normcasestr.stript과 함께 적용하면 모든 문제가 해결됩니다.

내가 코멘트에서 말했듯이, 어떻게 그런 실수를 저지르고 있는지 명확하지 않습니다. 디렉토리에

try: 
    open(fname) 
except IOError: 
    open(fname.lower()) 
+0

명확히하기 위해 예제를 추가했습니다. –

+0

마지막에 파일을 열면 닫힌 소스이며 내 제어 권한이 없습니다. 그래서 파일을 확인해야합니다. 그리고 예, 파일 참조는 내가 제어 할 수없는 도구에 직접 추가됩니다. –

+0

질문은 파일 이름에 대한 규칙이 있는지 여부입니다. 즉, 파일의 정확한 이름이'* .xml'이 아니라'* .xml'인지 어떻게 알 수 있습니까? 어떤 경우가 있는지 알아보기 위해 각 가능한 조합을 점검 할 수는 없다는 것을 알고 있습니까? – SilentGhost