파이썬 파일 폴더 조작 총정리 Python - File, directory manipulation
라즈베리파이에서 파이선으로 파일과 폴더를 다루는 방법입니다. 가장 먼저 OS 모듈을 임포트하는 것으로 시작합니다. 설명중 '경로'라 함은 폴더와 파일네임이 있는 운영체제 상의 PATH를 의미합니다. 폴더란 디렉토리와 같은 의미입니다. 그러니까 folder = directory 의미입니다.
import os
현재 작업 폴더를 출력합니다.
import os
dir = os.getcwd()
print(dir)
작업 폴더를 변경합니다.
import os
dir = os.getcwd()
print(dir)
os.chdir("/home")
dir = os.getcwd()
print(dir)
특정 경로에 대한 절대 경로 가져오기
import os
dir = os.getcwd()
print(dir)
os.chdir("/home")
dir = os.getcwd()
print(dir)
os.chdir("pi")
abs_dir = os.path.abspath('./rpi-work-forlder')
print(abs_dir) # '/home/pi/rpi-work-forlder'
경로에서 폴더 경로 이름만 가져옵니다.
import os
dir = os.getcwd()
print(dir)
os.chdir("/home")
dir = os.getcwd()
print(dir)
os.chdir("pi")
abs_path = os.path.abspath('./rpi-work-forlder')
print(abs_path)
dir_name = os.path.dirname('/home/pi/rpi-work-forlder/README.md')
print(dir_name)
출력
# '/home/pi/rpi-work-forlder'
경로에서 파일 이름만 가져옵니다.
import os
dir = os.getcwd()
print(dir)
os.chdir("/home")
dir = os.getcwd()
print(dir)
os.chdir("pi")
abs_path = os.path.abspath('./rpi-work-forlder')
print(abs_path)
dir_name = os.path.dirname('/home/pi/rpi-work-forlder/README.md')
print(dir_name) # '/home/pi/rpi-rgb-led-matrix'
filename = os.path.basename('/home/pi/rpi-work-forlder/README.md')
print(filename)
출력
# 'README.md'
경로에서 폴더 이름과 파일 이름을 나누어 가져옵니다.
import os
dir = os.getcwd()
print(dir)
os.chdir("/home")
dir = os.getcwd()
print(dir)
os.chdir("pi")
dir, file = os.path.split('/home/pi/rpi-rgb-led-matrix/README.md')
print(dir) # '/home/pi/rpi-rgb-led-matrix'
print(file) # 'README.md'
경로에 결합하여 새로운 경로를 만듭니다.
import os
new_path = os.path.join('/home', 'a', 'b')
print(new_path) #/home/a/b
파일네임의 확장자를 체크합니다. 결과값은 True 혹은 False
import os
filename = '/home/pi/rpi-rgb-led-matrix/README.md'
ok = filename.endswith('.md')
print(ok) # True
파일 이름과 확장자를 분리하여 가져옵니다.
import os
filename = '/home/pi/rpi-rgb-led-matrix/README.md'
name, ext = os.path.splitext(filename)
print(name) #'/home/pi/rpi-rgb-led-matrix/README
print(ext) # .md
파일과 폴더 경로가 존재하는지 검사합니다. 경로와 파일이름이 정확해야 합니다. 반환값은 True 혹은 False
import os
filename = '/home/pi/rpi-rgb-led-matrix/README.md'
ok = os.path.exists(filename)
print(ok) #True
폴더 경로가 존재하는지 검사합니다. 경로만 검사합니다.
import os
filename = '/home/pi/rpi-rgb-led-matrix/README.md'
dirname = '/home/pi/rpi-rgb-led-matrix'
ok = os.path.isdir(filename)
print(ok) #False
ok = os.path.isdir(dirname)
print(ok) #True
파일 경로를 검사합니다.
import os
filename = '/home/pi/rpi-rgb-led-matrix/README.md'
dirname = '/home/pi/rpi-rgb-led-matrix'
ok = os.path.isfile(filename)
print(ok) #True
ok = os.path.isfile(dirname)
print(ok) #False
파일의 크기를 가져옵니다.
import os
filename = '/home/pi/rpi-rgb-led-matrix/README.md'
size = os.path.getsize(filename)
print(size) #30875
파일 정보를 가져옵니다.
import os
from datetime import datetime
filename = '/home/pi/rpi-rgb-led-matrix/README.md'
ret = os.stat(filename)
print(ret)
mod_time = ret.st_mtime
print('modified : ' + datetime.fromtimestamp(mod_time))
출력은 아래와 같습니다.
root@raspberrypi:/tmp# python3 dir.py
os.stat_result(st_mode=33188, st_ino=131820, st_dev=45826, st_nlink=1, st_uid=1000, st_gid=1000, st_size=30875, st_atime=1570463433, st_mtime=1570463433, st_ctime=1577865179)
modified : 2019-10-08 00:50:33
폴더의 파일과 하위 폴더의 리스트를 가져옵니다.
import os
filenames = os.listdir('./')
for filename in filenames:
if True == os.path.isdir(filename):
print('dir:' + filename)
else:
size = os.path.getsize(filename)
print('%s --- %d bytes'%(filename, size))
출력은 아래와 같습니다.
dir:Documents
dir:thinclient_drives
s-safe --- 270 bytes
dir:opencv_contrib
2023-01-13-192925_1920x1080_scrot.png --- 1264547 bytes
2021-07-25-190049_1920x1080_scrot.png --- 156411 bytes
dir:.cache
cctv.py --- 382 bytes
dir:farmactubrowser
2023-01-13-193249_783x705_scrot.png --- 110007 bytes
.mysql_history --- 839 bytes
2023-01-13-185006_1920x1080_scrot.png --- 1580960 bytes
dir:iplcd
s-farm --- 273 bytes
dir:Desktop
dir:Raspberry-Pi-sample-code
dir:iot_homeserver
.xorgxrdp.10.log.old --- 19523 bytes
.xsession-errors.old --- 3011 bytes
dir:smartpet
2023-01-13-192940_1920x1080_scrot.png --- 1195032 bytes
폴더 경로를 탐색합니다. os.walk 함수를 사용합니다.
import os
from datetime import datetime
for dirpath, subdirs, filenames in os.walk('F:\\study'):
print('Current Directory:', dirpath)
print('Sub Directories:', subdirs)
print('Files:', filenames)
print()
출력은 다음과 같습니다. 보시다시피 os.walk 함수는 트리를 하향식 또는 상향식으로 걸어가면서 디렉토리 트리에 파일 이름을 생성합니다:
Current Directory: F:\study
Sub Directories: ['opencv']
Files: ['udpserver.py']
Current Directory: F:\study\opencv
Sub Directories: []
Files: ['animation.gif', 'animation.mp4', 'animation_rotate.py', 'biden.jpg', 'biden.png', 'exam1.py', 'exam2.py', 'exam3.py', 'exam4-numpy.py', 'exam4.py', 'exam5.py', 'exam6.py', 'rotate.py', 'run.jpg', 'sbear.png', 'smask.jpg', 'split.py']
새로운 폴더를 생성합니다.
import os
dirname = '/tmp/hello/yes' #no hello directory
try:
os.mkdir(dirname)
except FileNotFoundError: #python3 only
print('Error : ' + dirname + ' Not found ')
except FileExistsError:
print('Info : ' + dirname ++ ' already exist ')
dirname = '/tmp/hello'
try:
os.mkdir(dirname)
print('Success : ' + dirname + ' Create success')
except FileNotFoundError: #python3 only
print('Error : ' + dirname + ' Not found ')
파이썬의 os.makedirs() 메서드는 디렉터리를 재귀적으로 생성하는 데 사용됩니다. 즉, 중간 수준의 디렉터리가 누락된 경우 하위 디렉터리를 만드는 동안 os.makedirs() 메서드가 중간에 있는 해당 디렉터리를 모두 생성합니다.
import os
dirname = '/tmp/hello/yes' #no hello directory
try:
os.makedirs(dirname)
print('Success : ' + dirname + ' Create success')
except FileNotFoundError: #python3 only
print('Error : ' + dirname + ' Not found ')
폴더를 지웁니다.
import os
dirname = '/tmp/hello/yes' #not exist
try:
os.rmdir(dirname)
except FileNotFoundError: #python3 only
print('Error : ' + dirname + ' Not found ')
dirname = '/tmp/hello2' #hello2 contains files
try:
os.rmdir(dirname)
print('Success : ' + dirname + ' delete success')
except OSError as err:
print("OS error: {0}".format(err))
dirname = '/tmp/hello' #empty directory
try:
os.rmdir(dirname)
print('Success : ' + dirname + ' delete success')
except FileNotFoundError: #python3 only
print('Error : ' + dirname + ' Not found ')
파이썬의 os.removedirs() 메서드는 디렉터리를 재귀적으로 제거하는 데 사용됩니다. 지정된 경로의 리프 디렉터리가 성공적으로 제거되면 os.removedirs()는 오류가 발생할 때까지 경로에 언급된 모든 상위 디렉터리를 연속적으로 제거하려고 시도합니다. 일반적으로 오류는 삭제할 디렉터리가 비어 있지 않기 때문에 발생하므로 발생한 오류는 무시됩니다.
import os
dirname = '/tmp/hello/hello2'
try:
os.makedirs(dirname)
except FileNotFoundError: #python3 only
print('makedirs Error : ' + dirname + ' Not found ')
try:
os.rmdir(dirname) #only removes hello2 directory
except FileNotFoundError: #python3 only
print('rmdir Error : ' + dirname + ' Not found ')
try:
os.makedirs(dirname)
os.removedirs(dirname) #remove all (hello, hello2) directories
except FileNotFoundError: #python3 only
print('removedirs Error : ' + dirname + ' Not found ')
파일을 삭제합니다.
import os
filename = '/tmp/hello/aaa' #not exist
try:
os.remove(filename)
print('Success : ' + filename + ' delete success')
except FileNotFoundError as err: #python3 only
print("FileNotFoundErroor error: {0}".format(err))
filename = '/tmp/hello' #empty directory
try:
os.remove(filename)
print('Success : ' + filename + ' delete success')
except FileNotFoundError as err: #python3 only
print("FileNotFoundErroor error: {0}".format(err))
파일이나 경로 이름을 다시 설정합니다.
import os
dirname = '/tmp/hello' #Not exist
n_dirname = '/tmp/hello3' #Not exist
try:
os.rename(dirname, n_dirname)
print('Success : ' + dirname + ' rename success')
except FileNotFoundError as err: #python3 only
print("FileNotFoundErroor error: {0}".format(err))
dirname = '/tmp/hello2'
n_dirname = '/tmp/hello4' #exist
try:
os.rename(dirname, n_dirname)
print('Success : ' + dirname + ' rename success')
except FileNotFoundError as err: #python3 only
print("FileNotFoundErroor error: {0}".format(err))
'개발자 > 파이썬 Python' 카테고리의 다른 글
Tiny Python Projects 강의 영상과 소스코드 (0) | 2023.08.14 |
---|---|
파이썬에서 가장 많이 사용하는 상위 40개 라이브러리 (1) | 2023.06.26 |
Python에서 SIGINT(CTRL-C)와 같은 OS 신호 캡처 및 처리 (0) | 2023.04.26 |
Complete Python Roadmap for beginners in 2023 (0) | 2023.02.21 |
파이선 네이버 검색 키워드 분석 코드 (1) | 2023.02.16 |
OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 (0) | 2023.02.10 |
Python YouTube 동영상 다운로드 방법 (0) | 2023.02.06 |
파이썬 PDF 라이브러리 pdf 파일 분할, 병합, 자르기 및 변형 (0) | 2023.01.19 |
더욱 좋은 정보를 제공하겠습니다.~ ^^