파이썬 다중입력 및 문자열을 포함하는 파일명 검색..

조회수 5118회

안녕하세요.

코드를 짜다가 제 머리의 한계에 통탄하고 부득이 질문을 드리게 됬습니다.

간단히 말씀드리자면, 저희 회사 내부에 파일서버가 있는데(인증 관련 업무)

업무 특성 상 굉장히 많은 파일이 있습니다.

그래서 검색 코드를 짜는데 애를 먹고 있습니다.

제가 원하는 기능은

사용자에게 입력을 받을 때 가변적(개수)으로 받을 수 있는 방법이 있는지

그리고 검색 옵션을 1개가 아닌 그 이상으로 붙여 줄 수 있는지 입니다.

예를 들어 제가 찾고자하는 키워드가 "네덜란드", "원통형" , "전도체"

이 세가지의 문자열을 만족하는 파일의 경로를 출력 시켜 주려고 합니다.

이때, 제가 원하는 검색 옵션은 저런 문자열을 1개던 5개던 가변적으로 입력 변수로 줄 수 있는 것 입니다.

결과적으로 말씀드리면

제가 특정 키워드들(복수)를 입력값으로 주고 그 키워드값을 모두 만족하는

파일을 찾아 경로를 알려주는 코드를 짜고 싶습니다.

고수님들의 조언을 부탁드립니다. 온라인으로 주먹구구 배우니 정말 어렵네요 ㅠㅠ..

제가 짜던 코드입니다.

import os

selected_dir = "d:/"

goal = input("type what you want to search for: ")
input_list = goal.split()
input_list = [str(a) for a in input_list]

print (input_list)

for path, dirs, files in os.walk(selected_dir):
    for f in str(files):
        if input_list in f:
            print ("path : %s" % path)

현재 이 코드는

File "C:/Users/LGRnd/Desktop/Finder/Finder.py", line 16, in

if input_list in f: TypeError: 'in ' requires string as left operand, not list

오류가 납니다. if in 구문에서 타입이 맞지않아 에러가 나네요..

  • (•́ ✖ •̀)
    알 수 없는 사용자

3 답변

  • 정규식을 이용하면 간단합니다. aaaa|bbbb 라면 aaaa or bbbb 입니다. 즉 aaaa 혹은 bbbb 문자열이 있는 것을 찾습니다.

    import os
    import re
    
    selected_dir = 'ROOT_DIR'
    
    container = []
    goal = input("type what you want to search for: ")
    pattern = '|'.join(goal.split())       # aaaa|bbbb 
    
    for root, dirs, files in os.walk(selected_dir):
        for fileName in files:
            if re.search(pattern, os.path.splitext(fileName)[0]):          # 파일 존재여부
                container.append(os.path.join(root, fileName))          
    
    print(container)
    
    • 선생님, 조언 감사히 보았습니다. 하단의 컨테이너 어펜드 부분의 searchfile은 어떤 변수인가요? 알 수 없는 사용자 2017.2.15 09:11
    • 아 검색후 존재시 결과를 저장하는 부분인데 테스트도 안해보고 등록했네요. 수정했습니다. 정영훈 2017.2.15 09:39
  • 이렇게 하면 해당 폴더 내에서 검색어에 맞는 파일을 출력합니다.

    import os
    
    path = "/" #경로
    search_words = ["A","B"]
    for root, dirs, files in os.walk(path):
        for name in files:
            for search_word in search_words:
                if search_word in name:
                    print(os.path.join(root,name))
                    break
    
    • 정두식님, 하단에 제 코드를 코멘트 하였습니다. 도움 부탁드리겠습니다. 알 수 없는 사용자 2017.2.14 16:26
    • 질문을 수정해서 코드를 넣어 주시면 감사하겠습니다. 정토드 2017.2.14 17:27
  • 임의로 iec, hp 라는 조건으로 검색을 했는데 iec****_hp_2013 라는 테스트 파일이 검색이 안되네요. 제가 입력한 코드는 아래와 같습니다.

    import os
    
    selected_dir = "d:/"
    
    goal = input("type what you want to search for: ")
    
    input_list = goal.split()
    input_list = [str(a) for a in input_list]
    
    print (input_list)
    
    for root, dirs, files in os.walk(selected_dir):
        for name in files:
            for search_word  in goal:
                if goal in name:
                print (os.path.join(root, name))
                break
    

    이러면 제가 입력값으로 2개를 주었는데 2개의 조건을 만족하는

    파일을 검색하지 못합니다.

    입력인자는 고정이아니고 1개든 5개든 가변적으로 설정하고 싶습니다.

    가능할까요?

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)