티스토리 뷰
1. 압축파일 정리하기
# 현재 경로 알아보기
import os
os.getcwd()
# 정리 대상 디렉토리 경로 설정하기
target_path = './정리'
# '정리' 디렉토리에서 압축 파일 확인하기
zipfile_path = []
for filname in glob.glob(os.path.join(target_path, '**/*.zip'), recursive = True):
zipfile_path.append(filname)
print(zipfile_path)
# 압축 파일 해제하기
# for filename in zipfile_path:
# with zipfile.Zipfile(filename) as myzip:
# myzip.extractall('압축푸는곳')
import zipfile
for filename in zipfile_path:
with zipfile.ZipFile(filename) as myzip:
zipinfo = myzip.infolist()
# print(zipinfo) 압축파일 정보
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)
print(info)
# 결과 : 알축 파일을 해제한 파일명
<ZipInfo filename='./정리\\D_20220110_데이터저장_물류_001.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>
<ZipInfo filename='./정리\\D_20220110_데이터저장_물류_002.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>
<ZipInfo filename='./정리\\D_20220723_데이터저장_물류_001.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>
<ZipInfo filename='./정리\\D_20220723_센터가동현황_물류_002.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>
2. 파일명 정리하기
!pip install openpyxl
import openpyxl as 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'))
getFileName(target_path) # 정리 폴더의 모든 파일명을 filelist라는 엑셀에 입력
3. 파일명 변경하기
# excelRead()의 이름으로 아래와 같이 값을 반환하는 함수를 만들어보자
# 튜플로 (디렉토리, 변경전파일, 변경후파일) 나열되는 리스트를 반환
# 예) [('/.정리/', 'A_2022_01_13 부서로그_인사_001.pdf', 'A_2022_01_13_부서로그_인사_001.pdf'),
# ('./정리/', 'A_2022_01_13_부서로그_인사_002.pdf', 'A_2022_01_13_부서로그_인사_002.pdf')...]
def excelRead(filepath):
wb = opx.load_workbook(filepath) # filpath = './정리/fillist.xlsx'
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 = []
for i in range(1, len(dirpath)): # 0행은 제목이므로 제외
temp = (dirpath[i], file_before[i], file_after[i]) # 튜플형태로 저장
datalist.append(temp) # 빈 리스트에 튜플 추가
return datalist
rename_list = excelRead(os.path.join(target_path, 'filelist.xlsx'))
print(rename_list)
# 결과 :
[('./정리/', 'A_2022_01_13_부서로그_인사_001.pdf', 'A_2022_01_13_부서로그_인사_001.pdf', ...)
import shutil
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)
# 결과 :
A_2022_01_13_부서로그_인사_001.pdf의 파일명을 A_2022_01_13_부서로그_인사_001.pdf로 변경합니다
A_2022_01_13_부서로그_인사_002.pdf의 파일명을 A_2022_01_13_부서로그_인사_002.pdf로 변경합니다
.
.
.
내사진.jpg의 파일명을 쌤사진.jpg로 변경합니다
데이터저장_물류.zip의 파일명을 데이터저장_물류.zip로 변경합니다
새파일1_복사본.txt의 파일명을 새파일1.txt로 변경합니다
점심시간.txt의 파일명을 저녁시간.txt로 변경합니다
주피터노트북.txt의 파일명을 주피터노트북.txt로 변경합니다
4. 파일 분류 전 폴더 생성
# 디렉토리안의 파일을 확인하여 카테고리를 뽑아주는 함수
# ex) 생산, 클래스설계, 물류, 인사
import fnmatch
def categoryList(target_path: str) -> list:
file_list = []
for filename in os.listdir(target_path):
if fnmatch.fnmatch(filename, '*_[0-9][0-9][0-9].*'):
# 앞의 내용 상관없고, _ 뒤로 숫자 3자리, 확장자 모두 *
file_list.append(filename)
category = []
for file in file_list:
temp_list = file.split('_')
category.append(temp_list[-2])
temp_set = list(set(category))
return temp_set
categoryList(target_path)
# 결과 : ['클래스설계', '인사', '생산', '물류', 'ERD', '인사']
category_list = categoryList(target_path) + ['기타']
print(category_list)
# 결과 : # 결과 : ['클래스설계', '인사', '생산', '물류', 'ERD', '인사']
# 뽑아낸 category_list로 폴더 생성
import pathlib # 파일 시스템 경로를 문자열이 아닌 객체로 다룸
new_path = './정리폴더'
def makeDir(new_path, category_list):
for category in category_list:
new_dir = pathlib.Path(os.path.join(new_path, category))
# './new_정리' + '/클래스설계', '/물류', '/생산' ..
new_dir.mkdir(parents=True, exist_ok=True)
# mkdir() : 폴더 생성
# parents : 상위 디렉토리가 없을 경우 생성
# exist_ok : 디렉토리가 이미 존재하는 경우 오류를 발생시키지 않도록 함
makeDir(new_path, category_list)
( 결과 ) new_정리 폴더 안에 category_list 별로 폴더 생성
5. 파일 분류하기
import shutil
def moveFile(new_path:str, target_path:str, category_list:list):
dirlist = os.listdir(new_path) # 이동시킬 경로에 생성된 분류 list, './new_정리/클래스설계'
filelist = os.listdir(target_path) # 이동시킬 파일명 리스트, './정리
categorydict = {}
for file in filelist:
try:
temp_list = file.split('_') # ['C', '2022', '03', '30', '데이터베이스', 'ERD', '003.xlsx']
assert temp_list[-2] in category_list
# assert 조건식 : 조건에 맞지 않으면(False) 에러 발생
# assert : 주로 디버깅 및 테스트 목적으로 사용, 디버그 모드에서만 동작, 배포시에는 작동 x
# temp_list[-2] -> ['C', '2022', '03', '30', '데이터베이스', 'ERD', '003.xlsx']
# category_list -> ['기타', '인사', '생산', 'ERD', '물류', '클래스설계']
categorydict[file] = temp_list[-2] # {'파일명' : '분류명'}
# ex) dict['age'] = 20 -> {'age' : 20}
except:
categorydict[file] = '기타' # {'파일명' : '기타'}
for key, value in categorydict.items(): # 키와 밸류, 튜플 반환
shutil.copy(target_path + '/' + key, new_path + '/' + value)
# 예) './정리/A_2022_01_13_부서로그_인사_001.pdf'
# -> './new_정리/인사' 로 복사
moveFile(new_path, target_path, category_list)
( 결과 ) 생성한 폴더 안에 카테고리별로분류됨
'Python' 카테고리의 다른 글
27. (과제5) 디렉토리 정리 프로그램 활용 (1) | 2024.03.25 |
---|---|
26. (과제4) 영어 단어장 기능 추가 (1) | 2024.03.23 |
24. 파이썬의 파일 입출력 라이브러리 (1) | 2024.03.22 |
23. 파이썬의 변수 타입 어노테이션 (2) | 2024.03.22 |
22. (예제) 영어 단어장 만들기 (0) | 2024.03.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- MySQL
- trasform
- HTML
- Python
- 폼
- FOR
- 닷홈
- __call__
- Enclosing
- 솔로의식탁
- JavaScript
- 리스트
- DB단어장
- MySQLdb
- 고정위치
- 변수
- 셋
- 파이썬SQL연동
- EPL정보프로그램
- 절대위치
- CSS
- 출력
- animation적용
- 줄 간격
- DB프로그램만들기
- 상대위치
- 클래스문
- html이론
- 로또번호생성
- 박스사이징
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함