본문 바로가기
Python/Basic

[파이썬, Python] 파일 입출력 라이브러리 - 1️⃣fileinput & pickle_파일 읽기 및 저장하기!

by coding-choonsik 2023. 3. 14.
728x90
반응형
SMALL

1.fileinput

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

# 현재 경로 확인
os.getcwd()
>>> 'C:\\yesung\\jupyter'

# 디렉토리 내 모든 파일을 리스트로 불러옴
os.listdir(os.getcwd())
>>> ['.ipynb_checkpoints',
 '24_파일 입출력 라이브러리.ipynb',
 'dic.pkl',
 'list.pkl',
 'sample']

 

 

1-1. glob()

파일의 이름을 리스트로 반환

 

✅현재 폴더에 하위폴더 'sample'을 만들고 안에 새파일1~5.txt 5개의 파일을 만들었다.

 

# 경로 설정
path = 'sample/'

glob.glob(os.path.join(path, '*.txt'))
>>> 
['sample\\새파일1.txt',
 'sample\\새파일2.txt',
 'sample\\새파일3.txt',
 'sample\\새파일4.txt',
 'sample\\새파일5.txt']

 

✅ 각 파일에는 다음과 같이 3줄씩 '15번째 줄 입니다.' 까지 입력하고 저장했다.


1-2. input()

  • 파일에 있는 내용을 읽어옴

 

✅모든 txt파일의 내용을 읽어오기

 

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

 

위 코드를 작성 후 실행하니

UnicodeDecodeError: 'cp949' codec can't decode byte 0x84 in position 10: illegal multibyte sequence

위와 같은 인코딩 오류 발생,

5개의 txt 파일의 인코딩 문제로, 모두 인코딩을 ANSI 변환 후 재저장하고 다시 실행하니 잘 실행 되었다.

 

with fileinput.input(glob.glob(os.path.join(path, '*.txt'))) as f:
    for line in f:
        print(line)
        
>>> 1번째 줄 입니다.

2번째 줄 입니다.

3번째 줄 입니다.

4번째 줄입니다.

5번째 줄 입니다.

6번째 줄 입니다.

7번째 줄 입니다.

8번째 줄 입니다.

9번째 줄 입니다.

10번째 줄 입니다.

11번째 줄 입니다

12번째 줄 입니다.

13번째 줄 입니다.

14번째 줄 입니다.

15번째 줄 입니다.

1-3. isfirstline()

  • 파일의 첫번째 줄이면 True, 아니면 False를 반환

 

파일의 내용을 모두 읽어와 각 파일의 첫번째 줄을 '첫번째 라인입니다'로 변경하기

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

with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if f.isfirstline():    
            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:    
            print('첫번째 줄입니다',end='\n')
        else:
            print(line, end='')

'첫번째' 키워드가 있는 줄이 '첫번째 줄입니다'로 잘 변경되었다! 


✅ replace()를 통해  '12번째' 키워드를 '열두번째'로 치환하기

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

'12번째' 키워드가 있는 줄이 '열두번째'로 잘 치환되었다! 

 


2. pickle

  • 파이썬에서 사용하는 딕셔너리, 리스트, 클래스 등의 자료형을 변환 없이 그대로 파일로 저장하고 불러올 때 사용하는 모듈
  • 확장명 .pkl

 

✅ list 데이터 저장하기

import pickle

data = ['apple', ' banana', 'orange']

with open('list.pkl', 'wb') as f:   # 쓰기 모드
    pickle.dump(data, f)

list.pkl이 현재 경로에 잘 저장 되었다!

 

pkl확장명을 메모장으로 열었을 때

 

✅ 저장한 list.pkl 읽어오기

with open('list.pkl', 'rb') as f:   # 읽기 모드
    data = pickle.load(f)
    
type(data)
>>> list

print(data)
>>> ['apple', ' banana', 'orange']

✅ 딕셔너리 자료형 데이터 저장하기

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

with open('dict.pkl', 'wb') as f:
    pickle.dump(data, f)

dict.pkl이 현재 경로에 잘 저장 되었다!

 

✅ 저장한 dict.pkl 읽어오기

with open('dict.pkl', 'rb') as f:
    data = pickle.load(f)

type(data)
>>> dict
print(data)
>>> {1: {'id': 1, 'user_id': 'apple', 'name': '김사과', 'gender': '여자', 'age': 20}}  # 2차원 dict

 

 

728x90
반응형
LIST