본문 바로가기
Python/개념

Day 9-2. 파일 입출력 라이브러리

by 사라리24 2024. 3. 21.
SMALL

1. OS

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

 

 

os.getcwd()

: 현재 경로 가져오기

 
  import os

  # 현재 경로 가져오기
  os.getcwd()

  # 디렉토리 안에 파일(디렉토리)을 리스트로 반환
  os.listdir(os.getcwd())
 
/content
['.config', 'sample_data']

 

os.chdir()

: 작업 디렉토리 변경하기

 
  # 작업 디렉토리 변경하기
  os.chdir( ./data/ )
 

 

 

os.path.join( 'path명' ,  '파일명' )

: 파일경로 합쳐주기

  
  data_dir = './data/'
  file_path = os.path.join(data_dir,'output.txt')
  print(file_path)
 
. /data/output.txt
 
  txt_files = glob.glob(os.path.join('data/', '*.txt'))
  print(txt_files)
 
['data/output.txt', 'data/텍스트파일1.txt', 'data/텍스트파일3.txt', 'data/텍스트파일2.txt']

 

 

 

구분 함수명 설명
디렉터리 정보 os.getcwd() 현재 작업중인 디렉터리(cwd; current working directort) 정보를 리턴
os.listdir(path명) "path명"의 디렉터리 내 파일 및 서브디렉터리 정보를 list([])로 리턴
os.walk(path명) "path명"의 디렉터리 내 파일 및 서브디렉터리 정보를 top-down 방식으로 서브 디렉터리 말단까지 찾아서 리턴
디렉터리 변경 os.chdir(path명) 현재 디렉터리(cwd)를 "path명"으로 변경
디렉터리 생성 os.mkdir(path명 "path명"의 디렉터리를 생성
os.makedirs(path명) "path명"에 소속된 모든 빈 디렉토리를 모두 생성
디렉터리 삭제 os.rmdir(path명) "path명"의 디렉토리를 삭제
os.removedirs(path명) "path명"에 소속된 모든 빈 디렉터리를 모두 삭제
파일 삭제 os.remove(path명) "path명"의 파일을 삭제
이름 변경 os.rename(src, dest) "src"를 "dest"로 변경
존재 여부 파악 os.path.exists(path명) "path명"의 존재 여부를 리턴
os.path.isdir(path명) "path명"의 디렉터리 존재 여부를 리턴
os.path.exists(path명) "path명"의 file 존재 여부를 리턴
시스템 명령어 os.system(cmd명령어) "cmd명령어"를 실행

 

 

 

2. glob

glob 모듈은 파일과 폴더 이름을 찾을  사용하는 파이썬의 도구입니다 모듈의 이름은 "전역적으로 찾기"라는 의미의 "global"에서 유래했습니다. glob는 특정 패턴에 일치하는 파일이나 폴더 이름을 쉽게 찾아줍니다. (아래 파일을 다운로드 받아 압축을 풀고 예제를 진행합니다.)

 

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

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

  print(glob.glob(os.path.join('./data/', '*.txt')))
 
 
['./data/output.txt',
 './data/텍스트파일1.txt',
 './data/텍스트파일3.txt',
 './data/텍스트파일2.txt']
  • 현재경로에 있는 파일 찾기
 
  # .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 파일 모두 찾기
 
 # .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): # 글자수 4개
      print(filename)
 
없어서 검색결과 뜨지 않음
 
 
  for filename in glob.glob('??.*', recursive=True): # 글자수 4개
    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): # 알파벳 글자수 4개
      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

 

 

3. fileinput

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

 

현재 파일 경로

 

 

fileinput.input()

: 여러 파일을 동시에 읽어오기

 

 
 
  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. 오늘은 토요일

 

 

 

  • 각 파일의 첫번째 라인을 찾아 변경하기
 
  # 각 파일의 첫번째 라인을 찾아 변경하기
 
  with fileinput.input(txt_files, inplace=True) as f:
      for line in f: # 줄이 있는 동안 계속 반복
          if f.isfirstline(): #혹시 첫번째 라인이니?
              print('첫번째 라인이야!', end='\n') # 맞다면 txt파일에 print문이 바껴짐
          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: # 3 이 라인에 포함되어 있니?
              print(line.replace('3.', '세번째.'), end='') # 있다면 3을 세번째로 바꿔줘
         else:
              print(line, end='')
 

변경전 -> 변경후

 

4. pickle

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

바이트 스트림 : 리스트 등 자료구조, 객체는 파이썬에서 쓸 수 있는 메모리의 집합 , 쓰고 싶을 때 불러써 쓰는 것,  다른 언어로는 전달 불가능함, 그래서 바이트 스트림 형태로 변환해서 보내게 됨, 누구나 받아서 처리는 것으로 변환해야 함. 다른 언어에도 바이트스트림을 받아 원상태로 돌릴 수도 있음

더보기

바이트 스트림을 쓰는 이유

 

리스트 등 자료구조, 객체는 파이썬에서 쓸 수 있는 메모리의 집합 입니다.

리스트나 객체는 쓰고 싶을 때 불러써 쓰는 파이썬의 언어입니다.

그래서  다른 언어로는 전달 불가능하거나 달라질 수 있습니다.

그래서 바이트 스트림 형태로 변환해서 보내게 됩니다.

누구나 받아서 처리할 수 있고  다른 언어에도 바이트스트림을 받아 원상태로 돌릴 수도 있습니다.

예시1)

 
  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)
 
 
<class 'list'>
['apple', 'banana', 'orange']

ㄴ원상태로 복원됨

 

 

 

예시2)

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

  # 직렬화
  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}}

ㄴ원상태로 복원됨

5. 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')
 

 

 

6. fnmatch

 

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

 

 

 
  import fnmatch

  for filename in os.listdir('./data'):
      if fnmatch.fnmatch(filename, '?????[0-9].txt'):
          print(filename)
 
텍스트파일1.txt
텍스트파일2.txt
텍스트파일3.txt

 

 

 

7. 데이터 압축

 

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

 

 

1. zlib: 데이터를 압축하거나 해제할 때 사용하는 모듈

 
  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
 
 
130000
293

 

 
  print(compress_data)
 
b'x\x9c\xed\xc71\r\x00 \x0c\x000+\xe0f\'&H8\x16\xf6\xf0\xe0\x1e\x1f\xa4\xfd\x1a3\xb3\xda\xb8g\xd5\xee!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""?\xe6\x01le79'

 

 
  org_data = zlib.decompress(compress_data).decode('utf-8')
  print(len(org_data))
 
130000

 

 

2. gzip: 내부적으로 zlib 알고리즘을 사용

 
  import gzip

  with open('org_data.txt', 'w') as f:
      f.write(data)
 
 

 

 

 
  # gzip으로 압축
 
  import gzip

  with open('org_data.txt', 'w') as f:
      f.write(data)
 
 

 

1kb로 압축되었음

 

 
 
  # gzip 압축 해제
  import gzip

  with open('org_data.txt', 'w') as f:
      f.write(data)
 
 
 
130000

 

 

 

 

3. zipfile: 여러개 파일을 zip 확장자로 합쳐 압축할 때 사용

 
  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')
 
 

 

zip으로 저장됨

 

 

 
 
  # 압축 해제하기
  with zipfile.ZipFile('./data/새파일.zip') as myzip:
      myzip.extractall()
 
 

 

 

4. tarfile: 여러개 파일을 tar 확장자로 합쳐서 압축할 때 사용

 

 
  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('압축푸는곳2')
 

'Python > 개념' 카테고리의 다른 글

Day 10. 과제: 디렉토리 관련 프로그램  (0) 2024.03.24
Day 10. 디렉토리 관리 프로그램  (0) 2024.03.22
Day 9-1. 변수 타입 어노테이션  (0) 2024.03.21
Day 8-2. 파일 입출력  (0) 2024.03.20
Day 8-1. 파이썬 모듈  (0) 2024.03.20