KDT/Python

파일 입출력

jhwannabe 2023. 3. 13. 14:36

1. 파일 열기

파일변수 = open('파일이름', '파일 열기 모드')
  • 파일 열기 모드: w(출력), r(입력), a(추가출력)
  • w는 지정된 경로에 파일이 없으면 파일을 만든 후 저장하고, 파일이 있으면 기존의 모든 데이터를 지우고 다시 저장
  • r은 지정된 경로에 파일이 없으면 에러, 있으면 해당 파일의 데이터를 읽어옴
  • a는 지정된 경로에 파일이 없으면 파일을 만든 후 저장하고, 파일이 있으면 기존의 데이터 뒤에 이어서 저장
  • 파일 종류 모드: t(텍스트 파일, 생략 가능), b(바이너리 파일)
input = open('test.txt', 'r') # 텍스트파일 열기 모드
input = open('test.txt', 'rt') # 텍스트파일 열기 모드
input = open('test.jpg', 'rb') # 바이너리파일 열기 모드

✔ 파일을 출력할 때 작업이 모두 완료되면 반드시 close() 메소드를 사용해서 파일을 닫아야 정상적으로 데이터가 저장

 

파일 저장하기

  • write(): 파일에 데이터를 씀
file = open('data.txt', 'wt')
for i in range(10):
    file.write('파일 열기 테스트:' + str(i) + '\n') # \n: 파일 내에서 개행
file.close()
print('data.txt 파일에 쓰기 완료!')

파일 경로

  • 절대 경로: 디스크 드라이브의 최상위(root) 디렉토리부터 파일이 저장 또는 읽어올 디렉토리까지의 경로
    예) C:/jhwannabe/python/Day07
  • 상대 경로: 현재 화면에 표시되는 소스파일이 위치한 디렉토리부터 파일이 저장 또는 읽어올 디렉토리까지의 경로
    • 같은 디렉토리: 파일명 또는 ./파일명
    • 상위 디렉토리: ../파일명 또는 ./../파일명
    • 하위 디렉토리: 디렉토리명/파일명

※ \표기를 /로 변환할 것!

file = open('data/data.txt', 'wt')
for i in range(10):
    file.write('파일 열기 테스트:' + str(i) + '\n') # \n: 파일 내에서 개행
file.close()
print('data.txt 파일에 쓰기 완료!')

파일 읽어오기

  • read(): 파일로부터 데이터를 읽어옴
  • read(size): 사이즈만큼 데이터를 읽어옴
file = open('./data/data.txt', 'rt')
data = file.read()
file.close()
print('data.txt 전체 데이터 읽기 완료')
print(data)

# data.txt 전체 데이터 읽기 완료
# 파일 열기 테스트:0
# 파일 열기 테스트:1
# 파일 열기 테스트:2
# 파일 열기 테스트:3
# 파일 열기 테스트:4
# 파일 열기 테스트:5
# 파일 열기 테스트:6
# 파일 열기 테스트:7
# 파일 열기 테스트:8
# 파일 열기 테스트:9
file = open('./data/data.txt', 'rt')
data = file.read(10) # 유니코드 10글자 읽어옴
file.close()
print('data.txt 전체 데이터 읽기 완료')
print(data)

# data.txt 전체 데이터 읽기 완료
# 파일 열기 테스트:
# read(10)을 이용하여 data.txt에 있는 모든 데이터를 출력하기
file = open('./data/data.txt', 'rt')
while (1):
    data = file.read(10)
    if not data:
        break
    print(data, end='')
    
# 파일 열기 테스트:0
# 파일 열기 테스트:1
# 파일 열기 테스트:2
# 파일 열기 테스트:3
# 파일 열기 테스트:4
# 파일 열기 테스트:5
# 파일 열기 테스트:6
# 파일 열기 테스트:7
# 파일 열기 테스트:8
# 파일 열기 테스트:9

문제

  • 키보드로 데이터를 입력하고 텍스트 파일에 저장하는 프로그램을 작성해보자. (단, 'quit'이 입력되면, 저장을 끝내고 프로그램을 종료하자.)
  • 단어를 입력하세요: apple
  • 단어를 입력하세요: banana
  • 단어를 입력하세요: orange
  • 단어를 입력하세요: quit 저장되었습니다.
file = open('data/fruit.txt', 'wt')
while 1:
    fruit = input('단어를 입력하세요: ')
    if fruit == 'quit':
        file.close()
        break
    file.write('단어를 입력하세요: ' + fruit + '\n')
print('저장되었습니다.')

with 문

  • 자원을 획득하고 사용 후 반납해야하는 경우 블록으로 사용하는 문장
with open('data/fruit.txt', 'w') as f:
    while 1:
        fruit = input('단어를 입력하세요: ')
        if fruit.lower() == 'quit':
            break
        f.write(fruit + '\n')
    print('저장되었습니다.')
    
# 단어를 입력하세요: apple
# 단어를 입력하세요: banana
# 단어를 입력하세요: orange
# 단어를 입력하세요: melon
# 단어를 입력하세요: quit
# 저장되었습니다.

readline()

  • 텍스트 파일을 한 줄씩 읽어서 처리
  • 파일이 종료되어 더이상 읽을 수 없으면 빈 문자열 ''을 읽어옴
with open('./data/fruit.txt', 'r') as f:
    lines = []
    while 1:
        line = f.readline()
        if not line:
            break
        if len(line.strip()) != 0:
            print(line, end='')
            lines.append(line.strip())
print(lines)

# apple
# banana
# orange
# melon
# ['apple', 'banana', 'orange', 'melon']

readlines()

  • 전체 라인을 모두 읽어서 각 라인 단위로 리스트에 저장 (raw string으로 저장)
with open('./data/fruit.txt', 'r') as f:
    lines = f.readlines() # \n도 표기됨
    print(lines)
    
# ['apple\n', 'banana\n', 'orange\n', 'melon\n']

for i in lines:
    print(i, end='')
    
# apple
# banana
# orange
# melon

2. 인코딩과 디코딩

인코딩(Encoding)

  • 컴퓨터에서 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정
  • 인코딩 = 코드화 = 암호화 = 부호화
  • 예) 아스키코드 인코딩, URL 인코딩, Base64 인코딩, 유니코드 인코딩..
  • 유니코드
txt1 = 'Hello Python!'
type(txt1) # str

txt2 = txt1.encode('utf-8')
type(txt2) # byte
print(txt2) # b'Hello Python!'

txt3 = '안녕하세요 파이썬'
print(txt3.encode('utf-8'))
# b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94 \xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac'

디코딩(Decoding)

txt3 = '안녕하세요 파이썬'
txt4 = txt3.encode('utf-8')
print(txt4)
# b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94 \xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac'

print(txt4.decode('utf-8'))
# 안녕하세요 파이썬
728x90