본문 바로가기

코딩/파이썬

파일 입출력 라이브러리

os

: 파이썬의 os 모듈은 운영체제와 상호 작용하는 많은 함수와 유틸리티를 제공한다.

import os
# 현재 경로 확인
os.getcwd()

'/content'

# 디렉토리 안에 파일(디렉토리)을 리스트로 반환
os.listdir(os.getcwd())

['.config', 'sample_data']

# 경로 만들기
data_dir = './data/'
file_path = os.path.join(data_dir, 'output.txt')
print(file_path)

 ./data/output.txt

 

glob

: glob 모듈은 파일과 폴더 이름을 찾을 때 사용하는 파이썬의 도구이다. 이 모듈의 이름은 "전역적으로 찾기"라는 의미의 "global"에서 유래했다. glob는 특정 패턴에 일치하는 파일이나 폴더 이름을 쉽게 찾아준다.

 

import glob
# 해당 경로의 파일(디렉토리) 이름을 리스트로 반환
glob.glob(os.path.join('./data/', '*.txt'))

['./data/output.txt'

'./data/텍스트파일1.txt',

'./data/텍스트파일3.txt',

'./data/텍스트파일2.txt']

os.path.join('./data/', '*.txt')

'./data/', '*.txt'

for filename in glob.glob('*.txt'):
    print(filename)

오렌지.txt

사과.txt

바나나.txt

# 하위 경로의 txt 파일 찾기
for filename in glob.glob('**/*.txt'):
  print(filename)

data/output.txt

data/텍스트파일1.txt

data/텍스트파일3.txt

data/텍스트파일2.txt

# 현재 경로와 하위 경로의 txt 파일 모두 찾기
for filename in glob.glob('**/*.txt', recursive=True):
  print(filename)

오렌지.txt

사과.txt

바나나.txt

data/output.txt

data/텍스트파일1.txt

data/텍스트파일3.txt

data/텍스트파일2.txt

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

오렌지.txt

바나나.txt

for filename in glob.glob('??.*', recursive=True):
    print(filename)

사과.txt

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

 

abcdef.txt

for filename in glob.glob('[가-힣][가-힣].*', recursive=True):
  print(filename)

사과.txt

for filename in glob.glob('**/텍스*.*'):
    print(filename)

data/텍스트파일1.txt

data/텍스트파일3.txt

data/텍스트파일2.txt

for filename in glob.glob('**/*파일*.*'):
    print(filename)

data/텍스트파일1.txt

data/텍스트파일3.txt

data/텍스트파일2.txt

fileinput

: fileinput 모듈은 파이썬에서 여러 입력 스트림을 동시에 순회하는데 유용하다. 이 모듈의 주요 용도는 명령줄에서 명시된 여러 파일을 동시에 읽는 스크립트를 작성하는 것이다.

import fileinput
with fileinput.input(glob.glob(os.path.join('./data/', '*.txt'))) as f:
    for line in f:
        print(line)

1. 안녕하세요 파이썬!

2. 안녕하세요 파이썬!

3. 안녕하세요 파이썬!

4. 안녕하세요 파이썬!

5. 안녕하세요 파이썬!

1. 빨강

2. 노랑

3. 파랑

4. 초록

1. 오늘은 월요일

2. 오늘은 화요일

3. 오늘은 수요일

4. 오늘은 목요일

5. 오늘은 금요일

6. 오늘은 토요일

7. 오늘은 일요일

txt_files = glob.glob(os.path.join('data/', '*txt'))
print(txt_files)

['data/output.txt', 'data/텍스트파일1.txt', 'data/텍스트파일3.txt','data/텍스트파일2.txt']

 

각 파일의 첫번째 라인을 찾아 변경하기

with fileinput.input(txt_files, inplace=True) as f:
	for line in f:
    	if f.isfirstline():
        	print('첫번째 라인입니다', end='\n')
        else:
        	print(line, end='')

 

검색된 라인을 변경하기

with fileinput.input(txt_files, 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='')

pickle

: pickle 모듈은 파이썬 객체 구조를 직렬화하고 역직렬화하는 프로세스 제공한다. 다른 말로하면, 파이썬 객체(리스트, 딕셔너리, 클래스 인스턴스 등)를 바이트 스트림으로 변환하고,  바이트 스트림을 다시 파이썬 객체로 복원  있다.

import pickle
data = ['apple', 'banana', 'orange']
#직렬화: 바이트 스트림으로 변환
with open('list.pkl', 'wb') as f:
	pickle.dump(data. f)
#역직렬화: 바이트 스트림을 다시 파이썬 객체로 복원
with open('list.pkl', 'rb') as f:
    data = pickle.load(f)

print(type(data))
print(data)

['apple', 'banana', 'orange']

<class 'list'>

data = {}
data[1] = {'id':1, 'userid':'apple', 'name':'김사과', 'gender':'여자', 'age':20}
print(data)

{ 1: {'id':1, 'userid': 'apple', 'name' :'김사과', 'gender':'여자', 'age' : 20}}

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

print(type(data))
print(data)

<class 'dict'>

{ 1: {'id':1, 'userid': 'apple', 'name' :'김사과', 'gender':'여자', 'age' : 20}}

 

shutil

: shutil 모듈은 파이썬에서 고수준 파일 연산을 수행하기 위한 유틸리티 모듈이다. 기본적인 os 모듈에서 제공하는 기능을 확장하여, 파일  디렉터리를 복사, 이동, 삭제하는  사용할  있는  다양한 함수를 제공한다.

 

import shutil

# 파일 복사하기
shutil.copy('./Data/텍스트파일1.txt', './Data/텍스트파일1_복사본.txt')

# 파일 이동하기
shutil.move('./Data/텍스트파일1_복사본.txt', './텍스트파일1_복사본.txt')

# 확장명 바꾸기
shutil.move('./텍스트파일1_복사본.txt', './텍스트파일1_복사본.py')

# 확장명 바꾸기
shutil.move('./텍스트파일1_복사본.py', './텍스트파일1_복사본.txt')

fnmatch

fnmatch는 파일 이름과 패턴을 비교하거나 매칭하는 데 사용되는 Python의 표준 라이브러리 모듈 중 하나. 이 모듈은 와일드카드 문자(*, ?)를 사용하여 파일 이름을 패턴과 비교하고 일치하는지 확인하는 기능을 제공한다. 주로 파일 및 디렉터리 관리 작업에서 사용된다.

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

텍스트파일1.txt

텍스트파일3.txt

텍스트파일2.txt

 

데이터 압축

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

import zlib
data = 'Hello Python!' * 10000
print(len(data)) # 130000 byte
compress_data = zlib.compress(data.encode(encoding='utf-8'))
print(len(compress_data)) # 293 byte
print(compress_data)
org_data = zlib.decompress(compress_data).decode('utf-8')
print(len(org_data))

 

 

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

print(len(org_data))

 

zipfile

import zipfile
# 파일 합치고 압축하기
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('압축푸는곳')
import tarfile
# 파일 합치고 압축하기
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('압축푸는곳')