파이썬으로 원하는 파일 검색하기(다중 입력 검색조건..)

익명 사용자의 이미지

안녕하세요.

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

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

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

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

제가 원하는 기능은

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

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

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

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

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

결과적으로 말씀드리면

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

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

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

제가 짜던 코드입니다.

# finder
 
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

ymir의 이미지

질문 내용을 보고.. 그냥 임의의 단어들을 모두 포함하는 문자열을 검색할 수 있는지 궁금해서 찾아 봤는데..
regex 에 positive lookahead 라는게 있더군요.
http://www.regular-expressions.info/lookaround.html

파이썬이 아니라 도움은 안 되겠지만.. 그냥 참고 삼아 올려봅니다.

$ fcn \*.txt
./foo_bar.txt
./bar_baz_foo.txt
./bar_baz.txt
./foo/baz.txt
./bar/foo_bar.txt
./bar/bar_baz_foo.txt
./bar/bar_baz.txt
./bar/foo_bar_baz.txt
./foo_baz/a.txt
./foo_bar_baz.txt
 
$ fcn \*.txt | grep -P '(?=.*baz)(?=.*foo)'
./bar_baz_foo.txt
./foo/baz.txt
./bar/bar_baz_foo.txt
./bar/foo_bar_baz.txt
./foo_baz/a.txt
./foo_bar_baz.txt
 
$ fcn \*.txt | while read -r line; do grep -Pq '(?=.*baz)(?=.*foo)' <<<$(basename $line) && echo $line; done
./bar_baz_foo.txt
./bar/bar_baz_foo.txt
./bar/foo_bar_baz.txt
./foo_bar_baz.txt

$ cat run.sh
#!/bin/bash
 
echo -n "Input keywords to search : "
read -r keylist
 
set -a $keylist
until [ -z "$1" ] ; do
        pattern+="(?=.*$1)"
        shift
done
 
find $(pwd) -name \*.txt | while read -r line; do grep -Pq "$pattern" <<<$(basename $line) && echo $line; done
 
exit 0;
 
$ bash run.sh
Input keywords to search : foo baz
/home/ymir/t/bar_baz_foo.txt
/home/ymir/t/bar/bar_baz_foo.txt
/home/ymir/t/bar/foo_bar_baz.txt
/home/ymir/t/foo_bar_baz.txt

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지

거의 다 하신것 같은데요..

for search_word in goal:

에서 goal 대신에 input_list를 쓰면 일단 돌아가야할 듯합니다만..
익명 사용자의 이미지

아.. 입력은 "네덜란드 원통형 전도체" 처럼 공백으로 분리하고
" " 로 전체를 묶어야합니다.

익명 사용자의 이미지

"키워드값을 모두 만족하는" 은 일단 원래 코드 상으로는
"네덜란드" "원통형" "전도체" 중 하나라도 들어가 있으면 출력하는 코드입니다.

전부 들어가야하는 코드라면 좀 바꿔야합니다. 이것이 질문의 요지는 아닌듯 합니다만..
일단 하나라도 들어가면 출력하는 코드는

if any(search_word in name for search_word in input_list):
    print(name)

로 바꿀 수 있고, 전부 들어가야지만 출력하는 코드는 아래와 같이 할 수 있습니다.
if all(search_word in name for search_word in input_list):
    print(name)

2minchul의 이미지

1. sys.argv
2. *args

찾아보시면 반드시 도움이 되실겁니다.


이민철 올림

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.