반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


 

오늘은 파일과 폴더를 이동하거나 복사하고 싶을 때 사용하는 shutil 모듈에 대해서 공부해 보겠습니다.

 

1. 모듈 불러오기

 

우선 shutil 모듈은 따로 설치할 필요가 없이 바로 import 해주시면 됩니다. 지난 시간에 배웠던 os 모듈과 같이 파이썬 내장 라이브러리에 포함되어 있는 모듈이기 때문입니다.

 

import shutil

 

2. 파일을 특정 폴더로 이동하기_move( )

1) 상대경로 방식

# 방법 1 - 파일과 폴더가 현재 작업경로에 있는 경우만 가능
shutil.move('이동시킬 파일명.확장자', '파일을 이동시킬 폴더명')

# 예시
shutil.move('Test.xlsx', '테스트 폴더')

 

2) 절대경로 방식

# 방법 2 - 현재 작업경로와 상관없이 절대경로를 입력
shutil.move('이동시킬 파일 경로', '파일을 이동시킬 폴더의 경로')

# 예시
shutil.move('/Users/sangwoo/Desktop/PYTHON BASIC/Shutil Basic/Test.xlsx',
            '/Users/sangwoo/Desktop/PYTHON BASIC/Shutil Basic/테스트 폴더')

 

아래부터는 간결한 글을 위해서 상대 경로 방식으로만 코드를 작성하였으나, 위와 동일하게 절대경로 방식또한 가능한 점 참고해주세요.

 

 

3. 폴더 특정 폴더로 이동하기_move( )

 

파일과 마찬가지로 폴더도 이동시킬 수 있습니다. 이때 폴더 안의 모든 내용물이 함께 이동됩니다.

 

1) 폴더가 존재하는 경우

# 방법 1 - 파일과 폴더가 현재 작업경로에 있는 경우만 가능
shutil.move('이동시킬 폴더명', '이동할 폴더를 담을 폴더명')

# 예시
shutil.move('테스트 폴더', '테스트 폴더2')

 

2) 폴더가 존재하지 않는 경우

 

코드는 동일하지만 그 결과가 다릅니다. 만약 '테스트 폴더2'가 없는 경우, 기존의 '테스트 폴더'의 이름에 2가 추가되면서 안에는 'Test.xlsx' 파일이 위치하게 됩니다.

 

4. 파일을 특정 폴더로 복사하기_copy( )

# 방법 1 - 파일과 폴더가 현재 작업경로에 있는 경우만 가능
shutil.copy('복사할 파일명.확장자', '복사한 파일을 담을 폴더명')

# 예시
shutil.copy('Test.xlsx', '테스트 폴더')

 

 

5. 폴더를 특정 폴더로 복사하기_copytree( )

# 방법 1 - 파일과 폴더가 현재 작업경로에 있는 경우만 가능
shutil.copytree('복사할 폴더명', '복사될 새로운 폴더명')

# 예시
shutil.copytree('테스트 폴더', '테스트 폴더2')

 

폴더를 복사할  때 주의할 점은 '복사될 새로운 폴더명'과 동일한 폴더명이 존재하면 아래와 같은 에러 메시지를 띄운다는 것입니다.

 

FileExistsError: [Errno 17] File exists: '테스트 폴더2'

 

간단히 말해서, '테스트 폴더2'는 코드가 실행될 때 존재해서는 안됩니다.

 

만약 원하시는 기능이 기존 존재하는 폴더 안에 특정 폴더를 복사해야 하는 것이라면 아래와 같이 하셔야 합니다.

 

shutil.copytree('테스트 폴더', '테스트 폴더2/새로운 폴더명')

실행 결과


<참고 자료>

 

1. 파이썬을 이용한 파일 및 디렉터리 작업 - Code

https://code.tutsplus.com/ko/tutorials/file-and-directory-operations-using-python--cms-25817

 

2. shutil — 고수준 파일 연산 — Python 3.10.1 문서

https://docs.python.org/ko/3/library/shutil.html

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

오늘은 파이썬을 이용해 zip 파일을 만드는 방법에 대해 알아보겠습니다. 사무자동화를 할 때에 압축된 폴더를 다운로드 받거나, 압축해서 업로드 해야할 때 사용할 수 있습니다.

 


 

관련 패키지 불러오기

 

zipfile은 파이썬 표준 라이브로리로 따로 설치할 필요는 없고 import로 불러와주시면 됩니다.

 

import zipfile
import os

 

<파이썬 표준 라이브러리_zipfile 공식 문서>

https://docs.python.org/ko/3/library/zipfile.html

 

zipfile — ZIP 아카이브 작업 — Python 3.9.6 문서

zipfile — ZIP 아카이브 작업 소스 코드: Lib/zipfile.py ZIP 파일 형식은 흔히 쓰이는 아카이브와 압축 표준입니다. 이 모듈은 ZIP 파일을 만들고, 읽고, 쓰고, 추가하고, 나열하는 도구를 제공합니다. 이

docs.python.org

 

압축하기

 

바로 압축하는 방법에 대해서 알아보겠습니다. 원리는 간단합니다.

 

압축하고자 하는 zip 파일 생성 - zip 파일에 넣고 싶은 파일 write - zip 파일 닫기

 

이 3단계를 하나의 파일을 압축하는 경우와 여러개의 파일을 압축하는 경우 2가지로 나눠서 설명드려 보겠습니다.

 

 

하나의 파일 압축하기

 

1단계. 압축하고자 하는 zip 파일 생성 (꼭 os.chdir로 현재 경로를 바꾸어 줄 것)

 

먼저 os.chdir( )로 현재 작업할 경로를 다시 설정해줄 필요가 있습니다. 그러지 않고 절대 경로로 할 시, 의도와 다르게 가장 상위 디렉토리(폴더)부터 모든 디렉토리가 압축됩니다.

 

또한 zip 파일 생성을 위해 폴더를 따로 만들어 줄 필요가 없습니다. 곧 바로 zip 파일이 생성되는 것이니깐요.

 

os.chdir('/Users/username/Desktop/zipfile 패키지 테스트 폴더')

my_zip = zipfile.ZipFile('코딩유치원.zip', 'w')

 

<실행 결과> 코딩유치원.zip 생성됨

코딩유치원 폴더는 따로 만들어 줄 필요 없음

 

현재의 상태(zip 파일 close 안 해줌)에서는 아래와 같이 zip 파일을 열 수가 없다는 점 참고바랍니다.

 

 

 

2단계. 생성한 zip 파일에 넣고자 하는 파일 입력하기

 

아까 설정해준 현재 작업 경로에 test1.txt를 생성해두고 그것을 write 해줍니다.

참고로 현재 작업 폴더가 아닌 곳의 test1 파일을 write( '절대경로')로 입력할 시, 이상하게 작동하니 주의하세요.

 

# 현재 작업 경로에 test1.txt 파일이 있어야 함
my_zip.write('test1.txt')

 

<실행 결과> 코딩유치원.zip 안에 test1.txt 들어감

 

현재 상태에서도 zip 파일을 더블클릭해서 열어보려 해도 아래와 같은 경고창이 뜨면서 확인할 수가 없습니다.

 

 

3단계. zip 파일 닫기

 

zip 파일 안에 원하는 파일을 모두 넣으셨다면 close( ) 메소드를 통해 zip를 닫아주어야합니다.

 

my_zip.close()

 

<실행 결과> 코딩유치원.zip을 더블 클릭하여 압축해제 시

 

의도와 다르게 가장 상위 디렉토리(폴더)부터 모든 디렉토리가 압축된 것을 확인 할 수 있습니다. 다른 방법이 필요하겠습니다.

 

 

<주의!>

 

만약 경로를 chdir( )로 바꾸어 주지 않고 절대 경로를 사용하여 압축할 시 아래와 같이 의도치 않은 압축 파일이 생성됩니다.

 

my_zip = zipfile.ZipFile('/Users/username/Desktop/zipfile 패키지 테스트 폴더/코딩유치원.zip', 'w')

my_zip.write('/Users/sangwoo/Desktop/zipfile 패키지 테스트 폴더/코딩유치원/test1.txt')

my_zip.close()

 

여러개의 파일 압축하기

 

여러개의 파일을 한꺼번에 압축하려면 with 문과 for문을 함께 사용해 주시면 됩니다.

아래의 코드를 보시고 직접 한 번 해보시기 바랍니다. 그 외 개념은 위에서 했던 것과 같으므로 자세한 설명은 생략하도록 하겠습니다.

 

file_list = ['코딩유치원.txt', '투손플레이스.txt', '고양이미로.xlsx']

with zipfile.ZipFile("코딩은 코딩유치원이지ㅎㅎ.zip", 'w') as my_zip:

    for i in file_list:
        
        my_zip.write(i)
    
    my_zip.close()

 

<실행 결과> 

 

 

압축해제

 

압축을 해제 하는 방법은 크게 2가지가 있습니다. 여러 파일 중 1개만 골라서 압축해제하는 방법과 전체를 다 압축해제하는 방법입니다.

 

개별파일 압축해제

 

ZipFile.extract(member, path=None, pwd=None)

 

path에는 추출할 zip 폴더의 경로를 넣어줄 수 있으며, 넣어주지 않으면 현재 작업 폴더로 지정한 파일을 추출합니다. member는 파일명.확장자명이며, pwd는 암호화된 파일에 사용되는 비밀번호입니다.

 

zipfile.ZipFile('코딩은 코딩유치원이지ㅎㅎ.zip').extract('코딩유치원.txt')

 

<실행 결과> 

 

 

 

모든파일 압축해제

 

ZipFile.extractall(path=None, members=None, pwd=None)

 

path에는 추출할 zip 폴더의 경로를 넣어줄 수 있으며, 넣어주지 않으면 현재 작업 폴더로 지정한 파일을 추출합니다. members에는 리스트 형식의 '파일명'을 넣어주시면 선택적으로 여러개의 파일을 압축해제 가능하며, pwd는 암호화된 파일에 사용되는 비밀번호입니다.

 

# 전체를 압축해제 하고 싶을 때
zipfile.ZipFile('코딩은 코딩유치원이지ㅎㅎ.zip').extractall()

# 전체가 아닌 몇 개만 압축해제 하고 싶을 때
zipfile.ZipFile('코딩은 코딩유치원이지ㅎㅎ.zip').extractall(members = ['투손플레이스.txt','고양이미로.xlsx'])

 

 

오늘은 zipfile 패키지를 이용해 zip 파일의 압축/압축 해제 하는 방법에 대해서 알아보았습니다.

 

긴 내용 읽으며 공부하신 여러분! 고생 많으셨습니다!!

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

오늘은 저번 시간에 배웠던 경로(path)와 디렉토리(directory)를 파이썬에서 다룰 수 있게 해주는 모듈os 모듈을 공부해보겠습니다.

 

혹시 경로와 디렉토리에 대한 개념을 정확히 모르신다면 지난 시간의 글을 읽고 오시면 이해에 도움이 되실 것 같아요!

 

2021.06.05 - [파이썬 기초/기초 문법] - [Python 기초] 파이썬으로 경로와 디렉토리 다루기(feat. 절대 경로와 상대 경로)

 


 

1. os 모듈 불러오기

 

os 모듈은 기본적으로 설치되어 있는 파이썬 내장 라이브러리에 포함된 모듈입니다. 참고로 파이썬 내장 라이브러리에는 우리가 자주 사용하는 sys, time, random 모듈도 있답니다.

 

이미 설치되어 있기에 간단하게 import 해주면 되겠습니다.

 

import os

 

보통은 import os로 많이 사용하지만 from os import *으로도 os 모듈을 사용할 수 있다는 것 알아만 두시면 좋을 것 같아요.

혹시 두 방식의 차이점이 무엇인지 궁금하신 분들은 아래의 글을 참고해주세요.

 

2021.05.24 - [파이썬 기초/기초 문법] - [python 기초] import OO와 from OO import*의 차이

 

 

2. os 모듈의 함수들

 

아래의 os 모듈 공식 문서를 보시면 os 모듈에는 정말 많은 함수들이 내장되어 있습니다.

 

https://docs.python.org/ko/3/library/os.html

 

os — 기타 운영 체제 인터페이스 — Python 3.9.5 문서

os — 기타 운영 체제 인터페이스 소스 코드: Lib/os.py 이 모듈은 운영 체제 종속 기능을 사용하는 이식성 있는 방법을 제공합니다. 파일을 읽거나 쓰고 싶으면 open()을 보세요, 경로를 조작하려면 o

docs.python.org

 

수 십 가지의 함수를 모두 공부하는 것은 너무나도 비효율적인 일이니, 제가 생각하기에 가장 많이 쓸만한 함수만 골라서 알려드리겠습니다.

 

 

1) os.getcwd( )

 

현재 작업중인 경로를 문자열로 돌려주는 getcwd( ) 함수입니다. 저의 경우는 실행한 파이썬 파일이 위치한 VSCODE BASIC이라는 디렉토리(폴더)의 경로를 출력해주는 것을 확인할 수 있습니다.

 

print(os.getcwd())

<결과>
>>> /Users/sangwoo/Desktop/VSCODE BASIC

 

 

2) os.mkdir( )

 

괄호 안에 '원하는 경로' + '/새로운 디렉토리'를 써주면 새로운 디렉토리가 생겨납니다. 만약 이미 있는 디렉토리를 생성해주려고 하면 에러가 발생하니 주의하세요.

 

os.mkdir("/Users/sangwoo/Desktop/test_mkdir")

 

<결과>

 

 

3) os.makedirs( )

 

os.mkdir( )과 비슷하지만 조금 다릅니다. 뭐랄까.. 디렉토리를 연달아서 적어주면 줄줄이 소세지 처럼 디렉토리가 생성됩니다.

 

os.mkdir("/Users/sangwoo/Desktop/test_mkdir/a/b/c")

 

<결과>

 

 

4) os.listdir( )

 

정말 많이 사용하는 함수인 해당 경로에 위치하는 파일, 디렉토리 이름(확장자 포함)을 리스트로 돌려주는 함수입니다.

 

# os.listdir("/디렉토리")

# 현재 작업 경로에 있는 파일, 디렉토리 리스트 얻기
print(os.listdir(os.getcwd()))

 

좌측의 실제 디렉토리 목록들이 터미널에 출력되는 것을 보실 수 있습니다. 가만보니 .DS_Store라는 이상한 친구가 끼어 있는데 뭔지 나중에 알아봐야겠네요.

 

 

5) os.chdir( )

 

원하는 경로를 현재 작업 경로로 변환해주는 함수입니다. 함수를 사용하기 전과 후의 경로 차이가 나는 것을 확인할 수 있습니다.

 

print(os.getcwd())
os.chdir("/Users/sangwoo/Desktop/")
print(os.getcwd())

<결과>
>>> /Users/sangwoo/Desktop/RPA BASIC
>>> /Users/sangwoo/Desktop

 

6) os.removedirs( )

 

함수 이름에서 알 수 있듯이 디렉토리를 제거하는 함수입니다. 만들 때와 같이 제거하고자 하는 디렉토리의 경로를 써주시면 됩니다.

만약 경로가 열려있거나 존재하지 않으면 에러가 발생하니 주의하세요.

 

os.removedirs("/Users/sangwoo/Desktop/test_mkdir/a/b/c")

 

<결과>

 

 

7) os.remove( ) / os.unlink( )

 

위의 removedirs( ) 함수가 디렉토리를 삭제하는 함수였다면 이 함수는 파일을 삭제하는 함수입니다. 두 함수 모두 같은 기능을 합니다.

 

os.remove("/Users/sangwoo/Desktop/test_mkdir/a/b/ex_hello.py")

 

<결과>

 

ex_hello.py 사라짐. (귀찮아서 결과 사진 안올린거 아님.. 암튼 아님..)

 

 

8) os.rename(path 1, path 2)

 

파일의 이름을 바꿔주는 함수입니다. 기존 파일의 경로와 바꾸고자 하는 파일명이 들어간 경로를 차례대로 써주시면 되겠습니다.

 

 


오늘 준비한 내용은 여기까지 입니다.

 

<참고 자료>

 

1. 점프 투 파이썬 (05-6 라이브러리)

https://wikidocs.net/33

 

2. yg's blog, [Python] os 모듈, 파일(file)과 디렉토리(directory)활용

https://yganalyst.github.io/data_handling/memo_1/

반응형

+ Recent posts