본문 바로가기
개발/파이썬

23.03.14파이썬의 파일 입출력 라이브러리

by 상달군 2023. 3. 15.
728x90

목차

1. 파이썬의 파일 입출력 라이브러리

  • 파일 읽기 및 저장하기 
    • fileinput
    • pickle 클래스 다루기
  • 파일 찾기, 복사 ,이동 
    • 파일 확장자로 찾기
    • fnmatch() 함수
    • shutil
  • 파일 압축 
    • 데이터 압축 
    • zilb 이용
    • gzip 이용
    • zipfile 이용
    • tarfile 이용

 

23.파일 입출력 라이브러리(최종).ipynb

※여기부터는 한번에 여러 코드가 이어지기 때문에 구글코랩이 아닌 쥬피터를 사용했습니다.

1.파일 읽기 및 저장하기.

1-1.fileinput

  • 텍스트 파일을 읽고,쓰고,저장하는 기능을 편리하게 사용할 수 있도록 해주는 라이브러리
  • 여러개의 파일을 읽어서 수정할 수 있음
# 3가지 라이브러리 불러오기 
import fileinput
import os
import glob

# 현재 경로를 확인 하는 방법 os라이브러리 명령어 getcwd()함수 사용
os.getcwd()

# 디렉토리 내 파일 확인하기. os.listdir(경로)
os.listdir(os.getcwd())

# 경로 설정 
path = 'sample/'

# txt파일이 뭐가 있는지 확인 방법 => .join()명령어는 "연결해주겠다"
# glob()메소드 : 해당경로의 파일 이름을 리스트로 반환 해준다. 

glob.glob(os.path.join(path,'*.txt'))

# txt파일의 내용을 한꺼번에 불러와서 print해줌

with fileinput.input(glob.glob(os.path.join(path, '*.txt'))) as f:
    for line in f:
        print(line)
# 불러온 값을 txt_files 변수에 담아 준다. 
txt_files = glob.glob(os.path.join(path, '*.txt'))

# 변수에 담겨 있는 내용 확인 
txt_files
  • 한개씩 결과 값을 확인 하기 위해서 한 코드 블럭으러 나누었습니다. 

  • 각 파일의 첫번째 라인을 찾아  첫번째 라인의 내용을 '첫번째 라인입니다.'으로 변경(수정)
# 각파일의 첫번째 라인을 찾아  '첫번째 라인입니다.'로 변경(수정)된걸 확인 할수 있다.

with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if f.isfirstline(): #첫번째 라인인지 아닌지 검별 해주는 메소드 1번째 라인이면 Ture를 반환
            print('첫번째 라인입니다. ', end='\n')
        else :
            print(line, end='')
  • 검색된 라인을 변경 
# 검색된 문자열(=첫번째 라인입니다.)을  "1번째 라인입니다."로 변경하기

with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if line == '첫번째 라인입니다. \n': #첫번째 라인을 확인후 아래 내용으로 변경 
            print('1번째 라인입니다.', end='\n')
        else :
            print(line, end='')
  • 키워드 라인 변경 하기 
# '1번째'라는 문자열을 '첫번째 라인입니다.'로 변경하기 

with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if '1번째' in line: # '1번째'라인을 찾아
            print('첫번째 라인입니다.', end='\n')
        else :
            print(line, end='')
  • 치환 
# '12번째'라는 문자열을 찾아서 '열두번째'로 치환하기

with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if '12번째' in line: # '12번째'라인을 찾아
            print(line.replace('12번째', '열두번째'), end='')
        else :
            print(line, end='')

1-2.pickle 클래스 다루기

  • 파이썬에서 사용하는 딕셔너리, 리스트, 클래스 등의 자료형을 변환 없이 그대로 파일로 저장하고 불러올 때 사용하는 모듈
  • 리스트형 저장해보기
# pickle 모듈 불러오기
import pickle

# 리스트형 저장
data = ['apple', 'banan','orange']

# 파일 저장 (객체 자체가 저장되고, 바이너리로 저장된다)
with open ('list.pkl', 'wb') as f:
    pickle.dump(data, f)
    
# 파일 읽어 오기 
with open ('list.pkl', 'rb') as f:
    data = pickle.load(f)
    
# 타입확인
type(data)

# 내용 확인
print(data)
  • 딕셔너리 저장 해보기
import pickle

#딕셔너리 저장
data = {}
data[1] = {'id':1, 'userid':'apple', 'name':'김사과','gender':'여자','age':20}

# 저장된 딕셔너리를 dict.pkl로 파일로 저장하기
with open ('dict.pkl', 'wb') as f:
    pickle.dump(data, f)
    
# 파일 읽어 오기 
with open ('dict.pkl', 'rb') as f:
    data = pickle.load(f)
    
# 타입확인
type(data)

# 내용 확인
print(data)

 

2.파일 찾기, 복사 ,이동 

결과값을 확인 하면서 볼수 있게 코드 블럭을 나눠 놓았습니다. 

 

2-1.파일 확장자로 찾기

  • 현재 경로 부터 확인 해줍니다. 
    • 파일 입출력 같은경우 경로를 잘 찾아서 입력 해줘야 합니다!!!
import fileinput
import os
import glob

#현재 경로 확인
os.getcwd()
  • txt파일 찾아보기 
# 현재 경로에 있는 txt파일 찾아보기
for filename in glob.glob('*.txt'):
    print(filename)
  • 하위 경로에 존재 하는 txt파일 찾아보기
# 하위 경로에 있는 txt파일 찾아보기
for filename in glob.glob('**/*.txt'):
    print(filename)
  • 현재, 하위 경로를 모두 포함 하여 txt파일 찾아보기
# 현재와 하위 경로를 모두 포함하여 txt파일 찾기
for filename in glob.glob('**/*.txt',recursive=True):
    print(filename)
  • 파일명 글자수로 찾기  
# 파일명 글자수로 찾기 (현재 디렉토리내에서 )
for filename in glob.glob('????.*', recursive=True): #글자수 4개 (?갯수만큼)
    print(filename)
    
for filename in glob.glob('???????.*', recursive=True): #글자수 7개 (?갯수만큼)
    print(filename)
  • 문자열 패턴 포함 파일명 찾기 
# 문자열 패턴 포함 파일명 찾기(현재 디렉토리내에서 )
for filename in glob.glob('[a-z][a-z][a-z][a-z].*', recursive=True): #알파벳 a-z까지 4자리  
    print(filename)
    
# 현재 하위 디렉토리를 전체 다 확인 (**/)
for filename in glob.glob('**/새파일*.*'): #현재경로 하위 디렉토리 전체를 검색 후 새파일로 시작하는 모든 파일 찾기 
    print(filename)
    
#하위 폴더에서 '프로젝트'라는 단어 들어가는 모든 파일 찾아줘
for filename in glob.glob('**/*프로젝트*.*'):
    print(filename)

 

 

2-2.fnmatch() 함수

  • glob과 동일하게 특정한 패턴을 따르는 파일명을 찾아주는 모듈
  • 파일명 매칭 여부를 True,False 형태로 반환하기 때문에 os.listdir()함수와 함께 사용
import fnmatch

# 파일명은 '새'로 시작하고 '새'포함한 글자수는 4자리 이며, 확장명은 .txt를 검색
# 확장자를 제외한 파일명의 길이는 4개 이며, 파일명의 마지막 문자는 숫자 입니다. 

for filename in os.listdir('./sample'):
    if fnmatch.fnmatch(filename, '새??[0-9].txt'):
        print(filename)

 

2-3.shutil

  • 파일을 복사하거나 이동할때 사용하는 내장모듈
import shutil

# 파일 복사하기 
shutil.copy('./sample/새파일1.txt', './sample/새파일1_복사본.txt')

# 파일 이동하기 
shutil.move('./sample/새파일1_복사본.txt', './새파일1_복사본.txt')

# 확장명 바꾸기 제자리에서 제자리로 이동하면 덮어쓰기가 가능하다. 
#(move에는 덮어쓰기 기능도 있기때문에 확장명이 바뀐다. )
shutil.move('./새파일1_복사본.py','./새파일1_복사본.txt')

 

3.파일 압축 

3-1.데이터 압축 

  • 대용량 데이터 및 대량의 파일을 전송 시, 전송속도가 느리면 전송 문제가 발생할 가능성이 매우 높다.
  • 데이터 압축의 종류
    • 손실 압축 : 사람이 눈치채지 못할 수준의 정보만 버리고 압축하는 방법 (계속 버리다 보면 언젠가는 사람도 눈치챈다.)
    • 무손실 압축 : 데이터 손실이 전혀 없는 압축
  • 압축률 : 압축된 자료량(압축된 데이터 크기) / 원시 자료량(원래 데이터 크기)
  • 다양한 압축 알고리즘에 따라 압축 성능 및 시간이 좌우됨
  • '압축 한다'라는 말은 인코딩(Endoding)을 한다.
  • '압축을 푼다'라는 말은: 디코딩(Decoding)을 한다.

3-2.zilb 이용

  • 데이터를 압축 하거나 해제할때 사용하는 모듈
  • compress()와 decompress() 함수로 문자열을 압축하거나, 해제 하는걸 사용 할 수 있다.
  • 데이터 크기를 줄여서 전송이 필요한 경우 사용
  • 압축이 되었을때 용량 차이를 확인해 봅시다. 
    • 기본셋팅 
import zlib

# 변수에 'Hello Python!' 10,000번 담기 
data = 'Hello Python!' * 10000 

print(len(data))  
# 결과값 130000 byte
  • 압축하기
# zilb를 이용하여 파일 압축 하기 
compress_data = zlib.compress(data.encode(encoding = 'utf-8'))
print(len(compress_data)) 
# 결과값 293byte
  • 압축풀기
# zilb를 이용하여 파일 압축 풀기 
org_data = zlib.decompress(compress_data).decode('utf-8')
print(len(org_data))

 

3-3.gzip 이용

  • 파일을 압축하거나 해제할 때 사용하는 모듈
  • 내부적으로 zlib 알고리즘을 사용
import gzip

#위에서 사용한 'Hello Python!' 10,000번 담은 data를 'org_data.txt'파일 생성 
with open('org_data.txt', 'w') as f :
    f.write(data)
  • gzip으로 압축 
# gzip으로 압축
with gzip.open('compressd.txt.gz', 'wb') as f:      # 'wb'  :  쓰고 바이너리파일로 변경
    f.write(data.encode('utf-8'))
  • gzip으로 압축 풀기
# gzip으로 압축 해제
with gzip.open('compressd.txt.gz', 'rb') as f:      # 'wb'  :  쓰고 바이너리파일로 변경
    org_data = f.read().decode('utf-8')

 

3-4.zipfile 이용

  • 여러개 파일을 zip 확장자로 합쳐서 압축할때 사용하는 모듈
  • zipfile압축
import zipfile

# 여러 파일 합치고 압축하기
with zipfile.ZipFile('./sample/새파일.zip', 'w') as myzip:
    myzip.write('./sample/새파일1.txt')
    myzip.write('./sample/새파일2.txt')
    myzip.write('./sample/새파일3.txt')
    myzip.write('./sample/새파일4.txt')
    myzip.write('./sample/새파일5.txt')
  • zipfile압축 풀기 
# 압축풀기
with zipfile.ZipFile('./sample/새파일.zip') as myzip:
    myzip.extractall()

 

 

3-5.tarfile 이용

  • 여러개 파일을 tar 확장자로 합쳐서 압축할 때 사용하는 모듈
  • zipfile방법과 비슷하다.
  • tar 압축 
import tarfile

# tar로 압축하기
with tarfile.open('./sample/새파일.tar', 'w') as mytar:
    mytar.add('./sample/새파일1.txt')
    mytar.add('./sample/새파일2.txt')
    mytar.add('./sample/새파일3.txt')
    mytar.add('./sample/새파일4.txt')
    mytar.add('./sample/새파일5.txt')
  • tar 압축풀기
# tar 압축파일 압축 풀기
with tarfile.open('./sample/새파일.zip') as mytar:
    mytar.extractall()
728x90

댓글