본문 바로가기

코딩/파이썬

파이썬 과제 (6). 기사 스크랩 디렉토리 관리 프로그램

pom 파일

 

✔ 위의 pom파일에 있는 기사 스크랩한 파일들을 분류명대로 정리파일에 분류하기로 한다. (무작위로 스크랩하였음)

import os
import glob
import zipfile
import shutil
import fnmatch
import pathlib

 

- 먼저 관련된 모듈들을 임포트한다. 

os.getcwd()

 

- 현재 경로를 알아보는 코드 'C:\\pom\\KDT3\\Python\\jupyter\\filemanager\\pom' 안에 있는것을 확인할 수 있다.

# 압축파일 확인

zipfile_path = []
for filename in glob.glob(os.path.join(target_path, '**/*.zip'), recursive=True):
    zipfile_path.append(filename)
print(zipfile_path)

 

- 압축파일을 확인한다.

['.\\스크랩.zip']

 

(이처럼 압축 파일이 현재 경로 안에 잘 있는 것이 확인 가능하다.)

# 압축파일 해제

for filename in zipfile_path:
  with zipfile.ZipFile(filename) as myzip:
    zipinfo = myzip.infolist()
    for info in zipinfo:
      decode_name = info.filename.encode('cp437').decode('euc-kr')
      info.filename = os.path.join(target_path, decode_name)
      myzip.extract(info)

 

- 압축파일을 해제한다.

!pip install openpyxl

 

- 파일관리자 프로그램으로 openpyxl을 설치한다 (엑셀 작성 프로그램) 

import openpyxl as opx

 

-  openpyxl을 임포트한다. (opx로 별칭을 주었음)

def getFileName(target_path):
    wb = opx.Workbook()
    ws = wb.active

    ws.cell(row=1, column=1).value = '파일경로'
    ws.cell(row=1, column=2).value = '파일명(변경전)'
    ws.cell(row=1, column=3).value = '파일명(변경후)'

    i = 2

    current_dir = target_path
    filelist = os.listdir(current_dir)

    for filename in filelist:
      ws.cell(row=i, column=1).value = current_dir + '/'
      ws.cell(row=i, column=2).value = filename
      i = i + 1

    wb.save(os.path.join(target_path, 'filelist.xlsx'))

 

- 파일경로, 파일명(변경전), 파일명(변경후) 셀이 작성되는 filelist.xlsx 엑셀파일을 target_path에 생성하는 함수를 만든다.

 

getFileName(target_path)

 

- 함수를 실행시킨다.

# 파일명 변경하기

def excelRoad(filepath):
  wb = opx.load_workbook(filepath)
  ws = wb.active

  dirpath = [r[0].value for r in ws]
  file_before = [r[1].value for r in ws]
  file_after=[r[2].value for r in ws]

  datalist = []
  len_num = len(dirpath)
  for i in range(1, len_num):
      temp_tuple = (dirpath[i], file_before[i], file_after[i])
      datalist.append(temp_tuple)

  return datalist

 

- 파일명을 변경하여 깔끔하게 정리하는 함수이다.

rename_list = excelRoad(os.path.join(target_path, 'filelist.xlsx'))
print(rename_list)

 

- rename_list 변수에 함수를 할당하여 출력한다.

 

- 일단은 튜플화 되어 나타난다.

def fileRename(datalist):
    for data in datalist:
        print(data[1] + '의 파일명을' + data[2] + '로 변경합니다')
        shutil.move(data[0]+data[1], data[0]+data[2])
fileRename(rename_list)

 

(위와 같이 정리됨을 알 수 있다. -> 바뀐건 딱히 없지만 파일명을 정리 할 때 유용하게 사용할 수 있다.)

 

# 디렉토리안의 파일을 확인하여 카테고리를 뽑아주는 함수를 만들어보자
#['정치', '연예', '사회', '경제', 'IT']
# fnmatch.fnmatch() 메서드를 사용
def categoryList(target_path):
        file_list = []
        for filename in os.listdir(target_path):
            if fnmatch.fnmatch(filename, '*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_*.*'):
                file_list.append(filename)
        category = []
        for file in file_list:
            temp_list = file.split('_')
            category.append(temp_list[0])
        category = set(category)
        return list(category)
categoryList(target_path)

 

- 카테고리를 뽑아주는 함수이다. ['정치', '연예', '사회', '경제', 'IT'], 이렇게 리스트로 뽑아준다.

categorylist = categoryList(target_path) + ['기타']
print(categorylist)

 

- ['정치', '연예', '사회', '경제', 'IT'], 여기에 '기타'까지 포함된다.

['IT', '경제', '정치', '사회', '연예', '기타']
new_path = './정리'

 

- new_path에 정리 폴더를 지정한다.

def makeDir(new_path, categorylist):
    for category in categorylist:
        new_dir = pathlib.Path(os.path.join(new_path, category))
        new_dir.mkdir(parents=True, exist_ok=True)
makeDir(new_path, categorylist)

 

정리 파일

 

- makeDir 함수를 만들어 준다. -> 위처럼 분류된 폴더 생성

 

# 파일 분류 및 이동하기
def moveFile(new_path, target_path, categorylist):
    dirlist = os.listdir(new_path)
    filelist = os.listdir(target_path)

    categorydic = {}

    for file in filelist:
        try:
            temp_list = file.split('_')
            assert temp_list[0] in categosrylist
            categorydic[file] = temp_list[0]
        except:
            categorydic[file] = '기타'

    for key,value in categorydic.items():
        shutil.copy(target_path + '/' + key, new_path + '/' + value)
moveFile(new_path, target_path, categorylist)

 

- 파일을 분류한 폴더대로 분류후 이동시킨다.

 

‼트러블 슈팅!!


- 쥬피터 노트북을 사용하게 되면,

.ipynb_checkpoints 폴더가 생성되면서 자동적으로 노트북 파일이 그곳에 저장된다.

 

여기서 문제!!는,,, 

[Errno 13] Permission denied

 

이런 에러를 볼 수 있는데

 

이 에러는,

1. 이 파일을 현재 사용중에 있다

2. 권한이 없다

3. 파일이 아닌 폴더 경로이다

 

이러한 원인을 찾을 수 있다.

 

내가 볼땐 3번 같은 느낌적인 느낌인데,,,(?)

지금은 현재 해결할 수 없어 난관에 부딪혀 있는 상태이다.!!!!!!

 

-> 곧 해결 할 수 있도록 해보겠다~~ 

 

ok 여기까지.

'코딩 > 파이썬' 카테고리의 다른 글

파일 입출력 라이브러리  (0) 2024.03.21
파이썬 과제 (5). 영어 단어장 만들기 (파일 입출력)  (0) 2024.03.21
변수 타입 어노테이션  (0) 2024.03.21
파이썬 모듈  (0) 2024.03.20
파일 입출력  (0) 2024.03.20