2014-09-29 2 views
0

나는 좀 이상한 상황에 처해있다. 지정된 경로의 모든 하위 디렉토리에 대한 파일 시스템 검색을 수행하려고합니다. 대소 문자를 구분하거나 대소 문자를 구분하지 않는 검색에 대한 사용자의 요구를 존중하면서 결과를 반환하고 싶습니다. 이것은 Windows에서 잘 작동하는 것처럼 보이지만 Python에서 동일한 코드를 실행할 때 약간의 두통을주고 있습니다. 그것은 거친 샘플의 비트가우분투에서 파이썬의 os.walk와 대소 문자를 구분합니까?

import sys 
import os 

src = sys.argv[1] 
caseSensitive = sys.argv[2] 
searchText = sys.argv[3] 

if caseSensitive == False: 
    searchText = searchText.lower() 

print "Case sensitive: " + caseSensitive 
print "Src: " + src 
print "Search text: " + searchText 
fileCount = 0 
directoryCount = 0; 

if caseSensitive == True: 
    print "Performing case sensitive search..." 
else: 
    print "Performing case insensitive search..." 


for root, dirnames, filenames in os.walk(src): 
    for directory in dirnames: 
     if caseSensitive == True: 
      dMatch = directory 
     else: 
      dMatch = directory.lower() 

     print "D:" + dMatch 
     if dMatch.find(searchText) != -1: 
      print " **************dir match: " + dMatch 
      directoryCount = directoryCount + 1 
    for filename in filenames: 
     if caseSensitive == True: 
      fMatch = filename 
     else: 
      fMatch = filename.lower() 

     print "F:" + fMatch 

     if fMatch.find(searchText) != -1: 
      print " **************file match: " + fMatch 
      fileCount = fileCount + 1 

print "Matching files: " 
print fileCount 
print "Matching directories: " 
print directoryCount 

하지만 그것은 : 테스트 일을 위해서

, 정말 같은, 파이썬 코드의 작은 조각으로 주요 응용 프로그램의 일부 코드를 제거했습니다 적어도 내가하는 일에 대한 일반적인 생각을 제공합니다.

Foo 
    --bar 
    --Fizz 
    --Buzz 
     --Buzz.txt 

나는 "니어을"스크립트를 실행하고 푸 디렉토리에 그것을 지적하고, 단어를 소문자 구분 검색을 수행하도록 지시하는 경우 :

다음과 같이 내가 디렉토리 구조를 가지고 있다고 가정하자 , Windows에서 Buzz 디렉토리와 Buzz.txt를 찾습니다.

우분투에서 동일한 스 니펫을 실행하면 대소 문자를 무시하지 않는 한 전혀 결과가 반환되지 않습니다. os.walk()에 의해 발견 된 디렉토리와 파일 이름을 출력 할 때 모두 소문자로 출력합니다. 이것은 우분투에서 실행될 때 검색이 실패한 이유를 부분적으로 설명합니다. 대소 문자가 혼합 된 "Bu"와 "bu"를 비교하기 때문에 일치 항목을 찾을 수 없습니다. 일치하는 것으로 등록되지 않습니다.

짧은 이야기 : 내가 누락되었거나 우분투의 os.walk() 결과가 항상 소문자로 반환 되었습니까?

+5

'caseSensitive'는 문자열입니다.'False' 또는'True'와 결코 같지 않습니다. – isedev

+2

부수적으로, 당신은'if caseSensitive == True :'를 거의 테스트하지 않으려합니다. 일반적으로'if caseSensitive :'만을 원한다. 그래서 진실이 중요하다. 명시 적으로 'true'가 아니라는 사실을 확실하게 밝히고 싶다면'caseSensitive가 True : '(대부분'1 == True'가 참이기 때문에)를 항상 원할 것입니다. 자세한 내용은 [PEP 8] (http://legacy.python.org/dev/peps/pep-0008/#programming-recommendations)을 참조하십시오. – abarnert

+1

어쨌든 이런 종류의 문제는 정확하게 당신 자신의 코드에서 뚜렷한 것을 알아 채기가 어렵 기 때문에'print' 문장의 출력을 보면서 여기에 입력과 출력을 게시하고자하는 이유입니다. 인수로'False'를 사용 했더라도'Performing case sensitive search ... '가 표시된다면 처음 몇 줄의 코드 만 관련이 있다는 것을 즉시 알 수 있습니다. 'os.걷다. – abarnert

답변

0

os.walk에서는 isedev 및 abarnert가 지적한 바와 같이 문제가 아니었지만 문제는 프로덕션 코드에서 사용 된 라이브러리와 관련되어 있습니다. 프로덕션 코드에서, 그것은 다음과 같은 일을 하였다.

for root, dirnames, fileanmes in os.walk(src): 
    for filename in fnmatch.filter(filenames, '*' + searchText + '*'): 
     # If we are case insensitive, compare against a lowercase filename 
    for dirname in fnmatch.filter(dirnames, '*' + searchText + '*'): 
     # If we are case insensitive, compare against a lowercase dirname 

fmatch하고 있던 무엇 때문에 우리가보고 된 문제는, 그것은 실패했다 우리의 특정 상황에서, 우리가 정말 이상 대여섯 파일을 처리하지 않거나 디렉토리는 다음과 같이 바뀌 었습니다.

for root, dirnames, filenames in os.walk(src): 
    for filename in filenames: 
     # Do comparison on all filenames, not some fancy filtered list 
    for dirname in dirnames: 
     # Do comparison on all dirnames, not some fancy filtered list 

어떤 이유에서든 fnmatch 라이브러리는 우리가 생각하고있는 것을 정확하게 수행하지 못했습니다. 우리가해야한다고 생각했던 것은 와일드 카드 스타일 비교였습니다. 적어도 Windows에서는 그렇게되었습니다. 우분투에서 동일한 코드를 실행할 때, 그것이 있어야하는 것처럼 일치하는 것을 찾지 못했습니다.

도움을 주셔서 감사합니다. 여러분.

관련 문제