[Python] 파일 입출력/OS 모듈


OS 모듈이란?

OS모듈은 Operating System의 약자로, 운영체제와 관련된 기능을 제공하는 모듈입니다. 예를 들어 파일을 복사하거나 폴더를 새로 만들거나 파일을 지우는 등의 작업을 수행합니다.


경로 조작

os.path.join은 경로명 조작에 관한 함수로, 경로와 파일명을 결합하는 용도로 사용합니다. 이 함수를 사용하면 운영체제에 관계없이 경로를 알맞게 생성해줍니다. 리눅스와 맥에서는 /, 윈도우에서는 \\로 동작합니다.

import os
print(os.path.join('Users','USER','bin')) #Users\USER\bin

my_file = ['a.txt', 'b.docx', 'c.csv']
for i in my_file:
    print(os.path.join('D:\\python_study\\os_test', i))
#출력값
# D:\python_study\os_test\a.txt
# D:\python_study\os_test\b.docx
# D:\python_study\os_test\c.csv

os.path.basename은 경로의 기본이름을 반환합니다. , 경로에서 마지막 요소를 알 수 있습니다.

os.path.dirname은 디렉토리 이름을 반환합니다.

os.path.exists는 특정 폴더가 있는지 확인하는 함수입니다.

my_path = "D:\\python_study\\os_test"
print(os.path.basename(my_path)) #os_test
print(os.path.dirname(my_path)) #D:\python_study
print(os.path.exists("D:\\python_study")) #True
print(os.path.exists("D:\\kk")) #False

 

디렉토리 관리

getcwd()는 현재 디렉토리의 위치를 나타냅니다. chdir()는 디렉토리를 이동시키는 함수입니다.

print("현재 디렉토리: ", os.getcwd()) #d:\python_study\pythonProject001
os.chdir("D:\\python_study\\os_test")
print("이동 디렉토리: ", os.getcwd())

#출력값
# 현재 디렉토리:  d:\python_study\pythonProject001
# 이동 디렉토리:  D:\python_study\os_test

listdir()은 입력한 경로의 파일과 폴더 목록을 리스트로 반환하는 함수입니다. 현재 디렉토리의 내부 요소를 확인할 수 있습니다.

print(os.listdir("D:\\python_study\\os_test")) #['test1.txt', 'test2.txt']

 

폴더생성

mkdir()은 경로의 제일 마지막에 적힌 하나의 폴더만 생성합니다. 반면 makedirs()는 시작부터 끝까지 즉, 하위 디렉토리까지 모두 생성할 수 있습니다. 그리고 두 함수 모두 생성하려는 폴더가 이미 존재할 경우 FileExistsError 에러가 발생합니다.

폴더 생성 전

 

#mkdir()
os.mkdir("D:\\python_study\\os_test\\mkdir_test1") #생성됨

 

mkdir_test1 폴더 생성

 

#makedirs()
os.makedirs("D:\\python_study\\os_test\\makedirs_test1\\makedirs_test2") #생성됨

 

makedirs_test1, makedirs_test2 폴더 생성

 

폴더 삭제

rmdir()은 비어있는 디렉토리만 삭제할 수 있습니다. 예를들어 c:\test1\test2 폴더를 삭제하기 위해서는 test2를 삭제하고, test1을 삭제해야합니다. 반면 removedirs()는 모든 경로의 폴더를 한 번에 삭제할 수 있습니다. 그리고 두 함수 모두 test1을 바로 삭제하는 경우 OSError 에러가 발생합니다.

#rmdir()
#makedirs_test2 삭제 후 makedirs_test1 폴더 삭제
os.rmdir("D:\\python_study\\os_test\\makedirs_test1\\makedirs_test2")
os.rmdir("D:\\python_study\\os_test\\makedirs_test1")​
#removedirs()
#mkdir_test1 폴더 삭제
os.removedirs("D:\\python_study\\os_test\\mkdir_test1")

 

절대경로와 상대경로

절대경로는 항상 root 폴더에서 시작하는 경로로, 제일 첫 디렉토리를 기준으로 모든 경로를 입력하는 방식입니다. 상대경로는 현재 작업 폴더를 중심으로 시작하는 경로입니다.

 

dot(.) 1개는 현재 해당 파일이 담긴 디렉토리 경로입니다.

dot(.) 2개는 현재 디렉토리의 상위 디렉토리를 의미합니다.

현재 작업 폴더의 트리구조

#현재 작업 경로
print(os.getcwd()) #'D:\\python_study\\os_test'

#접근하고자 하는 폴더
#D:\python_study\os_test\makedirs_test1\makedirs_test2

#절대경로 사용하여 디렉토리 이동
os.chdir("D:\\python_study\\os_test\\makedirs_test1\\makedirs_test2")
print(os.getcwd())

#원래대로 바꾸기
os.chdir("D:\\python_study\\os_test")
print(os.getcwd())

#상대경로 사용하여 디렉토리 이동
os.chdir("makedirs_test1\\makedirs_test2")
print(os.getcwd())
#makedirs_test2에서 상위폴더인 makedirs_test1로 이동
#makedirs_test1로 상위폴더인 os_test 이동
#os_test 폴더 내에 있는 mkdir_test1로 이동
os.chdir("..\\..\\mkdir_test1")
print(os.getcwd()) #D:\python_study\os_test\mkdir_test1

 

디렉토리 트리

walk() 함수를 통해 디렉토리 내 경로, 파일을 모두 가져옵니다. 시작 디렉토리부터 하위에 있는 모든 디렉토리를 파악할 수 있습니다.

import os

for root, sub, file in os.walk('D:\\python_study\\os_test'):
    print('root: ' + root)
    for i in sub:
        print('\tsub: ' + i)
    for j in file:
        print('\t\tfile: ' + j)
    print()

#출력값
'''
root: D:\python_study\os_test
	sub: mkdir_test1
		file: file_create.txt
		file: test1.txt
		file: with.txt

root: D:\python_study\os_test\mkdir_test1
	sub: mkdir_test2

root: D:\python_study\os_test\mkdir_test1\mkdir_test2
'''