본문 바로가기

python

[코딩] 여러 파일에서 특정 키워드를 포함하는 파일 찾기(python)

728x90

 전공 수업인 데이터 마이닝 오티날에 깜짝 코딩 테스트를 치뤘다. 50분 동안 2문제를 푸는 거였는데 생각보다 어려웠어서 코드를 정리하고 간다. 

 

 실습 파일은 아래에서 다운받으면 된다. 

Dir.zip
0.00MB

 

 

 

 


문제?

 일단 데이터 우리는 다섯개의 문서 파일(txt)이 있다. 문서 안에는 여러 키워드가 존재하는데, 우리는 키워드를 검색하면 그 키워드가 포함된 문서를 찾는 코드를 짜야 한다. 

 

 

 


코드

 파일 경로 설정은 본인 설정에 맞게 잘 수정하면 된다. 클래스로 짜서 뭐가 복잡하게 보이지만 실제로 핵심 코드는 create() 밖에 없다. 

class create_word:
    def __init__(self):
        self.key=set()
        self.word_dic={}
        
    def create(self, file_route, file_name):
        d=open(file_route, "r").read().split()   #문자열=>리스트
        for i in d: 
            if i not in self.key:
                self.key.add(i)
                self.word_dic[i]={file_name}
            else:
                self.word_dic[i].add(file_name)
        
    def print_dic(self):
        for k,v in self.word_dic.items():
            print(k, end="\t")
            for i in v: print(i, end=" ")
            print()
                
if __name__=="__main__":
    result=create_word()
    result.create("C:/Users/User/Desktop/Dir/D1.txt", "D1")
    result.create("C:/Users/User/Desktop/Dir/D2.txt", "D2")
    result.create("C:/Users/User/Desktop/Dir/D3.txt", "D3")
    result.create("C:/Users/User/Desktop/Dir/D4.txt", "D4")
    result.create("C:/Users/User/Desktop/Dir/D5.txt", "D5")
    result.print_dic()

 

 일단 인자 값으로 파일의 경로와 파일 이름을 보내준다. 파일을 읽어오면 다음 과정을 거쳐 d에 저장된다.

 

  1. read()를 하면 파일에 읽는 내용을 '문자열'로 읽어온다.
  2. split()을 하면 공백을 기준으로 리스트에 넣어준다.(참고로 리스트는 split이 안 된다.)
def create(self, file_route, file_name):
        d=open(file_route, "r").read().split()   #문자열=>리스트

 

 이 리스트를 한 줄 씩 읽으며 딕션너리에 넣어주면 끝이다. 

  1. self.key는 set이다. 집합의 특징은? 중복을 허용하지 않는다! => key는 단어의 중복을 확인하는 역할!
  2. 만약 key값 안에 단어가 없으면 key에 넣어주고, 딕션너리에 추가해준다. 이때 딕셔너리의 값도 set로 파일의 이름이 들어간다.

(+) 왜 딕셔너리 값에 세트가 들어가냐면, 문서 파일 안에 중복된 단어가 있기 때문이다. 중복된 단어가 있는  문서의 이름이 여러 번 들어가는 것을 방지한다.  

        for i in d: 
            if i not in self.key:
                self.key.add(i)
                self.word_dic[i]={file_name}
            else:
                self.word_dic[i].add(file_name)