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
'개발 > 파이썬' 카테고리의 다른 글
23.03.21파이썬 DAO,DTO,VO (0) | 2023.03.21 |
---|---|
23.03.14파이썬의 폴더 관리 프로그램 (0) | 2023.03.15 |
23.03.13파이썬의 변수타입 어노테이션 (1) | 2023.03.13 |
23.03.13 파이썬의 클로저, 데코레이터 (0) | 2023.03.13 |
23.03.13파이썬의 파일 입출력 (0) | 2023.03.13 |
댓글