[Python] 코딩 도장 - 파일찾기

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: 파일찾기] - Lv.2

A라는 디렉토리 하위에 있는 텍스트 파일(*.txt) 중에서 LIFE IS TOO SHORT 라는 문자열을 포함하고 있는 파일들을 모두 찾을 수 있는 프로그램을 작성하시오.

단, 하위 디렉토리도 포함해서 검색해야 함.

출처: https://codingdojang.com/scode/404?answer_mode=hide


[풀이]

import os
import glob
import re

path = r'C:\Users\ekzm3\Desktop\Github_kkd\Python_Study_코딩 도장\A'

def search_file(root_path, filetype = "txt"):
    # 디렉토리 내의 txt 파일
    a = []
    a = a + glob.glob(os.path.join(root_path, f"*.{filetype}"))
    
    # 디렉토리 내의 모든 파일
    files = os.listdir(root_path)
    
    # 디렉토리 내의 파일이 폴더인 경우 txt 파일 찾기
    for file in files:
        path2 = os.path.join(root_path, file)

        if os.path.isdir(path2):
            a = a + glob.glob(os.path.join(path2, f"*.{filetype}"))
    
    # 파일명만 저장
    # b = [i.split("\\")[-1] for i in a]
    
    # 정규식 지정
    p = re.compile("LIFE IS TOO SHORT")

    for i in a:
        m = p.search(i)
        if m:
            print(i)
        
search_file(path)
C:\Users\ekzm3\Desktop\Github_kkd\Python_Study_코딩 도장\A\LIFE IS TOO SHORT - 복사본.txt
C:\Users\ekzm3\Desktop\Github_kkd\Python_Study_코딩 도장\A\LIFE IS TOO SHORT.txt
C:\Users\ekzm3\Desktop\Github_kkd\Python_Study_코딩 도장\A\새 폴더\AALIFE IS TOO SHORT.txt
C:\Users\ekzm3\Desktop\Github_kkd\Python_Study_코딩 도장\A\새 폴더 (2)\A_LIFE IS TOO SHORT.txt

우선 처음 경로에서 glob.glob()os.path.join()으로 txt파일은 모두 저장하는 방법을 선택했다.

그 후 하위 디렉토리에서도 같은 방법으로 txt파일은 모두 저장하였다.

마지막으로 정규식을 이용해서 LIFE IS TOO SHORT가 포함되어 있는 경우만 출력하였다.

for root, dirs, files in os.walk(path):
    for file in files:
        print(file)
b.txt
LIFE IS TOO SHORT - 복사본.txt
LIFE IS TOO SHORT.txt
AALIFE IS TOO SHORT.txt
af.txt
A_LIFE IS TOO SHORT.txt
c.txt

os.walk()를 사용하면 더 간단하게 모든 파일을 확인 할 수 있다.

나는 txt파일만 만들어 두었는데 여러 파일이 혼합된 경우를 고려해서 조건을 추가하면 더 간단하게 만들 수 있을 것 같다.


[추천 풀이]

import os

def func(dirname):
  for root, dirs, files in os.walk(dirname):
    for name in files:
      if '.txt' in name: 
        f = open(os.path.join(root,name),'r')
        txt = f.read()
        if 'LIFE IS TOO SHORT' in txt: print name
        f.close()

func('.')

이 분은 os.walk()로 푸셨는데 파이썬 2.x 버전이어서 수정은 안하고 그냥 대략적인 흐름만 이해하였다.

Leave a comment