본문 바로가기

Python 기초

파이썬 기초(21)- 파일 입출력 라이브러리(library)

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*

파이썬에서 파일을 관리하는 모듈의 종류는 다음이 있습니다.

  • os : 운영 체제와 상호작용하는 함수와 유틸리티 제공
  • glob : 파일, 폴더 이름 찾을 때 사용 도구
  • fileinput : 여러 파일 동시 읽는 스크립트 작성
  • pickle : 파이썬 객체 구조 직렬화, 역직렬화, 바이트 스트림 변환
  • shutil: 파일, 디렉토리 복사, 이동, 삭제, 함수 제공
  • fnmatch : 와일드카드 문자로 파일 이름, 패턴 비교
  • zlib : 데이터 크기를 줄여 송신
  • zipfile : 여러 파일을 zip으로 합침
  • gzip : 데이터를 압축하여 파일로 저장
  • tarfile : 여러 파일을 tar형식으로 합치거나 해제

1. OS

파이썬의 OS 모듈은 운영 체제와 상호 작용하는 많은 함수와 유틸리티를 제공합니다 .이 모듈을 사용하면 파일, 디렉토리(폴더) 또는 운영 체제와 관한 작업을 수행할 수 있습니다. 

1-1. os.getcwd()

os.getcwd() 메서드는 파일의 현재 경로를 확인하는 메서드입니다.

#os 모듈설치
import os
# 현재 경로 확인
os.getcwd()

참고: cwd는 current working directory의 뜻으로 현재 디렉토리의 경로를 확인한다는 뜻입니다.

1-2. os.listdir()

os.listdir() 메서드는 디렉토리 안의 파일을 리스트로 반환합니다.

#listdir()
os.listdir(os.getcwd())

1-3. os.path

os.path는 파일이나 폴더의 경로를 처리하고 지정할 때 사용합니다.

1-4. os.path.join()

os.path.join() 메서드는 여러 개의 경로 요소를 결합하여 하나의 경로로 만듭니다. 사용하는 상황은 디렉토리 다운로드의 경로가 길어질때, 다운로드 경로를 변수로 간단하게 처리하고 사용합니다.

  • os.join.path('다운로드 경로', ' '파일경로')
#os.path.join
data_dir='./data/'
file_path=os.path.join(data_dir,'./cotent/file.txt')
print(file_path)

a='/content/drive/MyDrive/KDT/module'
fi=os.path.join(a, '*txt')
print(fi)

경로 생성 후 출력

2. glob

glob 모듈은 파일과 폴더 이름을 찾을 때 사용하는 파이썬 도구입니다. 이 모듈의 이름은 '전역적으로 찾기'라는 'global'에서 유래해서 전체를 관장하는 의미입니다. glob은 특정 패턴에 일치하는 파일이나 폴더 이름을 쉽게 찾아줍니다.

  • 사용형태: glob.glob( '/디렉토리 주소/.*.파일형식')
#해당 경로의 파일 이름을 리스트로 변환
glob.glob(os.path.join('/content/drive/MyDrive/KDT /module', '*.txt'))

# 해당경로에서 txt파일 찾기(리스트형태)
glob.glob('/content/drive/MyDrive/KDT/module1/*.txt')

#해당경로에서 txt파일 찾기(for문 사용)
for f in glob.glob('/content/drive/MyDrive/KDT/module1/*.txt'):
    print(f)

glob.glob은 해당 경로의 파일 검색하기 기능입니다.

#현재 경로로 txt파일 찾기
for f in glob.glob('*.txt'):
    print(filename)

# 파일명 글자수로 찾기
for f in glob.glob('???.*', recursive=True):
    print(f)

참고: recursive는 '재귀적'이란 의미로 함수나 알고리즘이 자기 자신을 호출하는 것을 의미합니다. 함수나 알고리즘이 동일한 작업을 반복적으로 수행하는데 사용합니다. 디렉토리를 순회하고 모든 하위 디렉토와 파일을 검색하는 함수에서 recursive = True 을 사용하면, 함수가 재귀적으로 자기자신을 호출하여 디렉토리 구조- 하위 디렉토리 내용을 순회하고 검색합니다.

# 문자열 패턴 포함 파일명 찾기
for filename in glob.glob('[가-힣][가-힣][가-힣].*', recursive=True):
    # 알파벳 글자수 4개
    print(filename)

현재경로에 있는 바나나.txt의 파일이름이 3글자라서 [가-힣] 3번 반복

3. fileinput

fileinput 모듈은 파이썬에서 여러 파일을 입력 소스로 사용하여, 파일의 내용을 읽거나 수정할 수 있습니다. 파이썬 표준 라이브러리의 모듈 중 파일을 읽고 쓰는 작업을 간편하게 처리할 수 있습니다.

3-1. fileinput.input

fileinput.input은 여러 파일을 여러 파일을 순회하여 한번에 읽을 수 있습니다.

# fileinput.input을 사용해서 파일 읽기
with fileinput.input(glob.glob('/content/drive/MyDrive/KDT/module1/*.txt')) as f:
    for line in f:
        print(line)

3-2. isfirstline()

.isfirstline()을 사용해 해당 폴더의 모든 파일내용의 첫번째 줄 내용을 변경합니다.

# 해당 파일의 첫번째 줄 내용을 변경
with fileinput.input(glob.glob('/content/drive/MyDrive/KDT/module1/*.txt'), inplace=True) as f:
    for line in f:
        if f.isfirstline():
            print('첫번째 줄', end='\n')

        else:
            print(line, end='')

내용 변경

# 해당 파일에서 검색된 내용 변경
with fileinput.input(glob.glob('/content/drive/MyDrive/KDT/module1/*.txt'), inplace=True) as f:
    for line in f:
        if line =='첫번째 줄\n':
            print('검색된 줄의 내용을 변경함', end='\n')
        else:
            print(line, end='')

검색된 내용변경

# 키워드를 찾아 원하는 텍스트로 치환하기
with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if '3.' in line:
            print(line.replace('3.', '세번째.'), end='')
        else:
            print(line, end='')

4. pickle

pickle모듈은 파이썬에서 객체의 직렬화(serialize)와 역직렬화(deserialize)를 위한 내장 모듈입니다. 파일을 저장하거나 네트워크를 통해 전송할 때 사용합니다. 주의할 점은 파일은 바이너리 모드('wb', 'rb')로 열어야 합니다.

  • 바이너리: 0,1 숫자로 이루어진 이진법, 이진파일을 의미
  • wb: w는 쓰기모드, b는 바이너리 모드, 따라서 wb는 바이트 스트림으로 직렬화합니다
  • rb: r은 읽기모드, b는 바이너리 모드, 따라서 rb는 바이트 스트림으로 역직렬화합니다.

4-1. serialize(직렬화)

#변수 설정
data={'name':'John','age':30, 'city':'Seoul'} 

#serialize 직렬화
with open('dick.pkl','wb') as f:
    pickle.dump(data, f)

4-2. deserialize(역직렬화)

#deserialize 역직렬화
with open('dick.pkl','rb') as f:
    data=pickle.load(f)
print(data)
print(type(data))

5. shutil

shutil모듈은 파일 및 디렉터리 복사, 이동, 이름 변경, 삭제 등의 역할을 수행합니다. 따라서, 파일을 다룰 때 가장 중요한 모듈 중 하나이기도 합니다.

5-1. 파일 복사

shutil.copy(src, dst)는 파일을 복사합니다. src는 source의 준말로 소스 파일 경로이고, dst는 destination(목적지)의 준말로 대상 파일 경로를 말합니다.

#shutil.copy
shutil.copy('/content/drive/MyDrive/KDT/module1/사과.txt', './사과.txt')

src경로의 파일을 sample_data로 복사

5-2. 파일 이동

shutil.move(src, dst)는 파일 또는 디렉토리를 이동합니다.

#shutil.move
shutil.move('./사과_복사본.txt', './data/사과_복사본.txt' )

6. fnmatch

fnmatch(file name matching)파일 이름을 패턴 매칭을 통해 검사하는 기능을 제공하는 파이썬의 내장 모듈입니다.

#fnmatch
if fnmatch.fnmatch('example.txt', '*txt'):
    print('match')

for filename in glob.glob('/content/drive/MyDrive/KDT/module1/*.txt'):
    if fnmatch.fnmatch(filename, '*.txt'):
        print(filename)

7. 데이터압축

파이썬에서는 데이터 압축 및 아카이브 생성을 위한 여러 모듈을 제공합니다 .이러한 모듈을 사용하면 다양한 파일 압축 및 아카이브 형식으로 데이터를 처리할 수 있습니다.

7-1. zlib

deflate알고리즘은 다양한 압축 유형에서 사용되며 주로 gzip, zlib형식의 데이터를 생성하는데 사용하는데, 여기서 zlib데이터 압축 및 해제를 위한 파이썬 내장 모듈입니다.

#byte용량 확인
data= 'zlib을 이용한' *100
print(len(data)) #->900 byte사용

#zlib 압축
a=zlib.compress(data.encode('utf=8'))
print(a)

#zlib 해제
b=zlib.decompress(a)
print(b)

7-2. gzip

zip형식의 파일을 압축하고 해제할 수 있습니다.

#gzip
#압축
with gzip.open('org_data.txt.gz', 'wb') as f:
    f.write(data.encode('utf-8'))
#해제
with gzip.open('org_data.txt.gz', 'rb') as f:
    org_data= f.read().decode('utf-8')

print(len(org_data))

7-3. zipfile

zipfile모듈은 zip 파일을 만들거나 해제할 수 있습니다.

# 파일 합치고 압축하기
with zipfile.ZipFile('./data/새파일.zip', 'w') as myzip:
    myzip.write('./data/텍스트파일1.txt')
    myzip.write('./data/텍스트파일2.txt')
    myzip.write('./data/텍스트파일3.txt')
    
# 압축 해제하기
with zipfile.ZipFile('./data/새파일.zip') as myzip:
    myzip.extractall('압축푸는곳')

 

7-4. tarfile

tarfile은 tar 파일을 만들거나 해제할 수 있습니다. tar형식 파일은 Tape Archive의 약자로, 여러 파일을 그룹화하여 하나의 파일로 만들어주는데 사용합니다.

# 파일 합치고 압축하기
with tarfile.open('./data/텍스트파일.tar', 'w') as mytar:
    mytar.add('./data/텍스트파일1.txt')
    mytar.add('./data/텍스트파일2.txt')
    mytar.add('./data/텍스트파일3.txt')
    
# 압축 해제하기
with tarfile.open('./data/텍스트파일.tar') as mytar:
    mytar.extractall('압축푸는곳')