이전 까지만 하면 단순히 기능의 구현을 중점적으로 생각하였다.

 

주어진 핵심 조건은

 

1. 파일을 생성하여 자료를 저장하는 기능을 추가하고 저장시 해시태그 또는 관련검색어 기능을 첨부하여 저장하는 기능

 

2. 해시태그 또는 관렴검색어가 포함된 저장한 자료를 다시 자료를 검색하여 출력하는 기능

 

현재 구현한 결과물은 조건의 핵심인 '해시태그' 기능이 들어가 있지 않고 단순히 파일의 내용만을 찾는 프로그램을 완성하였다.

 

전체적인 방향성은 잡혔지만 핵심 코드를 만들기 위해 수정해야겠다.

 

일단 함수화하여 프로그램을 작성하여 구현하였다.

 

첫번째로 파일을 생성하는 함수 구현

 

# 파일을 생성하는 함수 정의

def produce_file (name):
 
  file = open(name,"w+") # "w+ 속성으로 파일이 없으면 생성함"
 
  num = int(input("생성할 텍스트의 줄 개수를 입력해주세요 : "))

  for i in range(num):
    file.write(input(f"내용 입력({i+1}번째 줄) : ")+"\r")

  file.close()

name = input("생성할 파일의 이름 입력 : ")

produce_file(name)

open 함수의 기능으로 파일을 생성하는 함수이다.

 

여기서 저장 마지막에 검색 시 해당 파일이 추가되도록 태그를 부여하는 기능을 추가하여야 한다.

 

 

태그를 어떻게 구현할까 고민하다가 파이썬의 자료구조 중 "딕셔너리" 자료형 을 사용하는 방법을 찾았다.

 

파일을 저장시 딕셔너리의 키값으로 content 부분과 tag  부분으로 나누어 저장하는 방법이다.

 

이러한 기능을 이용하기 위해서는 json 형식으로 파일을 저장하는 방법을 사용하였다.

 

'''

json 파일 형식을 찾기전 pickle 모듈을 찾았었는데,

이 모듈은 텍스트 처럼 파일 자체를 활용 할 수 없는 pickle 형식의 파일로 생성되었다.

pickle 파일형식은 변수 같은 코딩에 사용하는 조각들을 저장하기 위한 것이라고 일단은 생각하고 넘어갔다.

'''

 

# 파일 및 태그 생성

import json

def produce_file():
    file_name = input("파일명을 입력하세요 : ")
    tags_input = input("태그를 입력하세요 (띄어쓰기 구분): ")
    tags = [tag.strip() for tag in tags_input.split(' ')]
    file_content = input("파일에 저장할 내용을 입력 : ")

    file_data = {'content': file_content, 'tags': tags}
   
    with open(file_name + '.json', 'w') as file:
        json.dump(file_data, file)

    print(f"파일 '{file_name}.txt'이(가) 생성되었습니다.")

출력 결과

 

이제 파일을 생성했으니 태그로 파일을 검색하는 기능을 구현 하였다.

 

# 태그로 파일 검색

 

def tag_finder():

  target_tag = input("찾을 태그를 입력하세요 : ")
  target_tag = target_tag.strip() // 앞뒤 공백 제거

  files = [f for f in os.listdir('.') if os.path.isfile(f) and f.endswith('.json')]
// 현재 디렉터리의 json 파일 리스트
  matching_files = []
// 찾은 파일 리스트
  count = 0
// 찾은 파일 개수
  for file_name in files:
        with open(file_name, 'r') as file:
            file_data = json.load(file)
            tags = file_data.get('tags', [])
            if target_tag in tags:
                matching_files.append(file_name)
                count += 1


  if matching_files:
        print(f"태그 '{target_tag}'와 관련된 파일 목록:")
        for matched_file in matching_files:
            print(f'총 {count}개의 파일을 찾았습니다.')
            print("찾은 파일 리스트")
            print(matched_file)

  else:
        print(f"태그 '{target_tag}'와 관련된 파일이 없습니다.")

 json 파일 형식을 file_data = json.load(file) 코드로 불러온 다음에

get() 함수로 'tags' 키워드만 추출하여 tags 변수에 저장 후 if문으로 순회하며 검사하도록 만들었다.

 

전처럼 찾은 파일의 개수와 이름 리스트까지 출력해주도록 구현하였다.

 

# 전체 코드

 

# 10월 16일

# 파일을 생성하는 함수 정의

import hashlib

import os
import json


def produce_file():
    file_name = input("파일명을 입력하세요 : ")
    tags_input = input("태그를 입력하세요 (띄어쓰기 구분): ")
    tags = [tag.strip() for tag in tags_input.split(' ')]
    file_content = input("파일에 저장할 내용을 입력 : ")

    file_data = {'content': file_content, 'tags': tags}
   
    with open(file_name + '.json', 'w',encoding='UTF8') as file:
        json.dump(file_data, file)

    print(f"파일 '{file_name}.txt'이(가) 생성되었습니다.")

# 파일의 해시값을 구하는 프로그램

def hash_find(filepath, blocksize=8192):
    sha_1 = hashlib.sha1()
    try:
        f = open(filepath, "rb")
    except IOError as e:
        print("file open error", e)
        return
    while True:
        buf = f.read(blocksize)
        if not buf:
            break
        sha_1.update(buf)
    return sha_1.hexdigest()

def content_finder(target_directory, target_word):
  count = 0
  find_list = []

  for (path, files) in os.walk(target_directory):
    # 경로
    # 경로 내 디렉터리 리스트
    # files : 해당디렉터리의 파일
    # print(path, dir, files)
   
    for filename in files:
        # print(path+os.sep+filename)
        with open(path+os.sep+filename, 'r', encoding='UTF8') as f:# 인코딩 utf8로 지정하지 않으면 한글이 깨짐
        # os.sep은 경로구분자 \
        # with, f를 활용하여 자동으로 close
            try:
                if target_word in f: # 파일에 내용이 포함되어 있으면
                  # print("-----------------------------------------------------------------")
                  # print(f"'{filename}'파일에 해당 '{target_word}' 내용이 포함되어 있습니다.")
                  count += 1
                  find_list.append(filename)

            except: # 파일의 내용을 탐색할 수 없다면
                pass
        if count == 0:
          return print("해당 내용이 포함되어있는 파일이 존재하지 않습니다.")
  print(f'총 {count}개의 파일을 찾았습니다.')
  print("찾은 파일 이름 리스트 출력")
  for name in find_list:
    print(name)

def tag_finder():

  target_tag = input("찾을 태그를 입력하세요 : ")
  target_tag = target_tag.strip()

  files = [f for f in os.listdir('.') if os.path.isfile(f) and f.endswith('.json')]

  matching_files = []
  count = 0

  for file_name in files:
        with open(file_name, 'r') as file:
            file_data = json.load(file)
            tags = file_data.get('tags', [])
            if target_tag in tags:
                matching_files.append(file_name)
                count += 1


  if matching_files:
        print(f"태그 '{target_tag}'와 관련된 파일 목록:")
        for matched_file in matching_files:
            print(f'총 {count}개의 파일을 찾았습니다.')
            print("찾은 파일 리스트")
            print(matched_file)

  else:
        print(f"태그 '{target_tag}'와 관련된 파일이 없습니다.")



print("파이썬 프로젝트 실행")

while True:
  print("=========================================================================================")
  print("1. 파일 생성 2. 파일의 해시 값 찾기 3. 파일의 내용으로 파일 검색 4. 태그 내용으로 파일 검색")
  print("=========================================================================================")

  choice = int(input("기능을 선택하세요 : "))

  if choice == 1:
    produce_file()
  elif choice == 2:
    find = input("해시 값을 찾을 파일의 이름 : ")
    print(hash_find(find))

  elif choice == 3:
    dir = "C:/Users/ehdck/Desktop/FileFinder_python"
    tag = input("검색할 내용(콘텐츠) 입력 : ")
    content_finder(dir,tag)

  elif choice == 4:
    tag_finder()

  else:
    print("프로그램을 종료 합니다.")
    break

3번 기능인 파일의 해시 값을 찾는 프로그램도 서치하여 추가하였다.

 

아직 이것을 활용하지 않았지만 처음 접근하였을 때 파일만의 해시 값도 존재 하는 것을 활용할 수 있을 까 생각해보았다.

 

hashlib 모듈을 활용하였고 전에 학습했던 해시맵 자료 구조를 컴퓨터에서 활용하는 것을 눈으로 볼 수 있었다.

 

이제 직접 만든 코드를 사용해 보았다.

 

1. 파일 생성 

파일 이름 : 테스트1

태그 : 테스트 test project python

파일 내용 : 안녕하세요 테스트 파일 입니다.

 

2. 파일 내용 검색

안녕하세요로 검색

 

3. 태그로 검색

project와 python 검색

 

파일 내용 검색이 안되는 문제가 있었다. 파일 내용 검색 기능은 텍스트 파일만 지원하였다.  그래서 

 

1. json 파일 형식을 텍스트 파일로 변환하는 기능

2. json 의 콘텐츠를 키 값을 이용하여 검색

 

2. 번 방법은 태그 값으로 찾는 방법과 원리가 동일하므로 2번 방법을 택하였다.

 

def content_finder():
  target_content = input("검색할 내용을 입력하세요 : ")
  target_content = target_content.strip()

  files = [f for f in os.listdir('.') if os.path.isfile(f) and f.endswith('.json')]

  matching_files = []
  count = 0

  for file_name in files:
        with open(file_name, 'r') as file:
            file_data = json.load(file)
            content = file_data.get('content', [])
            if target_content in content:
                matching_files.append(file_name)
                count += 1

  if matching_files:
        print(f"태그 '{target_content}'와 관련된 파일 목록:")
        for matched_file in matching_files:
            print(f'총 {count}개의 파일을 찾았습니다.')
            print("찾은 파일 리스트")
            print(matched_file)

 

태그 파인더 함수와의 변경점은 찾는 내용에 맞게 변수명을 수정하여 주었고

딕셔너리의 key 값을 content로 바꾸어 주었다.

 

그 이외의 원리는 동일하다.

 

# 실행결과

 

 

# 마무리

 

프로젝트의 제약조건과 내용을 좀 더 살펴보며 고민하는 시간을 충분히 가져야 겠다.

 

처음에는 정말 멘땅에 헤딩하는 느낌으로 다가왔었다.

 

직접 프로젝트를 하나부터 만드는 경험은 처음이였기 때문에 그랬다.

 

지금의 코드에서 또한 수정되거나 개선할 사항을 꼼꼼히 확인해야겠다.

 

# 추가할 기능 및 수정사항

 

1. 파일 삭제 기능 파일 명으로 파일 삭제

(+ 검색 한 파일 리스트 중 선택하여 삭제 하기) 

2. json 파일 형식을 텍스트 파일로 변환하는 기능

3. 파일의 해시값을 활용할 방안

 

 

+ json 파일 형식 학습하기

 

전 웹 api 활용하는 것을 학습하였을 때 자바스크립트에서 json 파일을 활용하는 경험이 있었다.

정확하지  않을 수 있지만 자바스크립트의 클래스 파일 형식과 json 파일형식과 유사하였고

백 엔드 서버에서 api를 통해 json 파일을 가져와 활용할 수 있는 시간이 있었다. json 파일을 활용할 수 있는 방법을 학습해야겠다는 생각이 들었다.

 

 

'프로젝트 > 파일 내용 탐색 프로그램' 카테고리의 다른 글

프로젝트 보고서 작성  (0) 2023.10.18
6일차 마무리  (1) 2023.10.17
4일차 기능 추가 및 선택지 추가  (0) 2023.10.15
3일차 본격적인 코드 구현  (0) 2023.10.14
glob 모듈  (0) 2023.10.12