■ 공부/Python

DAY 8-1. 파일 입출력 라이브러리

J U N E 2024. 3. 21. 20:37

이번 편은 굉장히 유익한 게 많은 듯!

확실히 라이브러리 많이 아는 것이 힘이야....

 

1. OS 모듈 (import os)
os.getcwd() - 현재 경로 확인
os.listdir(os.getcwd()) - 디렉토리 안의 파일을 리스트로 반환

#경로만들기
data_dir = './data/'file_path = os.path.join(data_dir, 'output.txt')  #경로를 합쳐주는 역할

 

2. Glob (import glob) : 파일과 폴더 이름을 찾을 때
glob.glob(os.path.join('./data/', '*.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):     # ??? : 3글자짜리만 찾음 .*: 확장명 상관없이
    print(filename)

# 문자열 패턴 포함 파일명 찾기
for filename in glob.glob('[a-z][a-z][a-z][a-z][a-z][a-z].*', recursive=True):    #[a-z] : 한글자짜리
    print(filename)

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

for filename in glob.glob('**/텍스*.*', recursive=True):    #해당 글자가 포함되어 있는 파일 찾기
    print(filename)

for filename in glob.glob('**/*파일*.*', recursive=True):    #해당 글자가 포함되어 있는 파일 찾기. LIKE 쓰듯이?
    print(filename)
3. fileinput (import fileinput)

with fileinput.input(glob.glob(os.path.join('./data/', '*.txt'))) as f:   #input: 읽어들여오기
    for line in f:
        print(line)

#각 파일의 첫번째 라인을 찾아 변경하기
with fileinput.input(txt_files, inplace=True) as f: #inplace = 덮어쓰기
    for line in f:
        if f.isfirstline():
            print('첫번째 라인입니다', end='\n')
        else:
            print(line, end='')

#검색된 라인을 변경하기
with fileinput.input(txt_files, inplace=True) as f: #inplace = 덮어쓰기
    for line in f:
        if (line == '첫번째 라인입니다\n'):
            print("검색된 라인을 변경했음", end='\n')
        else:
            print(line, end='')

#키워드를 찾아 원하는 텍스트로 치환하기
with fileinput.input(txt_files, inplace=True) as f: #inplace = 덮어쓰기
    for line in f:
        if '3. ' in line:
            print(line.replace('3.', '세번째.'), end='')
        else:
            print(line, end='')
4. pickle (import pickle) : 파이썬 객체를 바이트스트림으로 변환하여 보내고, 다시 바이트스트림으로 받아 객체로 복원

with open('list.pkl', 'wb') as f:
    pickle.dump(data, f)   #바이트 코드로 변환 (= 직렬화)

# 역직렬화: 바이트 스트림을 다시 파이썬 객체로 복원. 확장명은 아무거나 써도 됨. abc같이
with open('list.pkl', 'rb') as f:
    data = pickle.load(f)print(data)print(type(data))
5. shutil (import shutil) : 파일 복사, 이동

shutil.copy('./data/텍스트파일1.txt', './텍스트파일1_복사본.txt')

shutil.move('./텍스트파일1_복사본.txt', './data/텍스트파일1_복사본.txt')

shutil.move('./data/텍스트파일1.txt', './data/텍스트파일1.py') #옮기면서 확장명 변경도 가능
6. fnmatch (import fnmatch) : 파일 비교

for filename in os.listdir('./data'):
    if fnmatch.fnmatch(filename, '?????[0-9].txt'): 
      print(filename)
7. 데이터 압축
크게 4가지로 정리 

7-1. zlib
compress_data = zlib.compress(data.encode(encoding='utf-8')) - 압축
org_data = zlib.decompress(compress_data).decode('utf-8') - 복원

7-2. gzip (gz)
#127kb
with open('org_data.txt', 'w') as f:
    f.write(data)

#1kb
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')

7-3. zipfile

with zipfile.ZipFile('./data/새파일.zip', 'w') as myzip:
    myzip.write('./data/텍스트파일1.py')
    myzip.write('./data/텍스트파일2.txt')
    myzip.write('./data/텍스트파일3.txt')

with zipfile.ZipFile('./data/새파일.zip') as myzip:     #r은 생략돼있음
    myzip.extractall('압축푸는곳')


7-4. tarfile      #zip은 윈도우, tar은 맥 / 메소드도 거의 비슷함

with tarfile.open('./data/새파일.tar', 'w') as mytar:
    mytar.add('./data/텍스트파일1.py')
    mytar.add('./data/텍스트파일2.txt')
    mytar.add('./data/텍스트파일3.txt')

with tarfile.open('./data/새파일.tar') as mytar:
    mytar.extractall('압축푸는곳2')