본문 바로가기

Python

22. 파일 입출력

1. 파일 열기

파일 변수 = open('파일명', '파일 열기 모드 및 종류 모드')
  • 파일 열기 모드 : w(출력), r(입력), a(추가출력)
  • w는 지정된 경로에 파일이 없으면 파일을 만든 후 저장하고, 파일이 있으면 기존의 모든 데이터를 지우고 다시 저장
  • r은 지정된 경로에 파일이 없으면 에러, 있으면 해당 파일의 데이터를 읽어옴
  • a는 지정된 경로에 파일이 없으면 파일을 만든 후 저장하고, 파일이 있으면 기존의 데이터 뒤에 이어서 저장
  • 파일 종류 모드 : t(텍스트 파일, 생략 가능), b(바이너리 파일)
input = open('text.txt', 'r') # 텍스트파일 열기 모드
input = open('text.txt', 'rt') # 텍스트파일 열기 모드
input = open('apple.jpg', 'rb') # 바이너리파일 열기 모드
파일을 출력할 때 작업이 모두 완료되면 반드시 close() 메소드를 사용해서 파일을 닫아야 정상적으로 데이터가 저장됨

1-1. 파일 저장하기

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

# data.txt 파일에 쓰기 완료!

텍스트 파일 생성

1-2. 파일 경로

  • 절대 경로 : 디스크 드라이브의 최상위(root) 디렉토리부터 파일을 저장 또는 읽어올 디렉토리까지의 경로
    • C:/hhj/python/day2
  • 상대 경로 : 현재 화면에 표시되는 소스파일이 위치한 디렉토리부터 파일을 저장 또는 읽어올 디렉토리까지의 경로
    • 같은 디렉토리 : 파일명 또는 ./파일명
    • 상위 디렉토리 : ../파일명 또는 ./../파일명
    • 하위 디렉토리 : 디렉토리명/파일명
file = open('./data/data.txt', 'wt') # data 폴더가 없으면 FileNotFoundError 오류 발생
for i in range(10):
  file.write('파일 열기 테스트 : ' + str(i) + '\n') # \n 파일 내에서 개행
file.close()
print('data.txt 파일에 쓰기 완료!')

# data.txt 파일에 쓰기 완료!

data 폴더안에 텍스트 파일 생성

1-3. 파일 읽어오기

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

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

'''
data.txt 일부 데이터 읽기 완료
파일 열기 테스트 
'''
# read(10)을 이용하여 data.txt에 있는 모든 데이터를 출력하기

file = open('./data/data.txt','rt')
while True:
  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('test.txt', 'wt')
str1 = ''
while True:
  str1 = input('단어를 입력하세요 : ')
  
  if str1.lower() == 'quit':
    break

  file.write(f'{str1}\n') # \n 파일 내에서 개행

file.close()

print('저장되었습니다.')

1-4. with 문

  • 자원을 획득하고 사용 후 반납해야 하는 경우 블록으로 사용하는 문장
with open('test.txt', 'wt') as f:

  while True:
    str1 = input('단어를 입력하세요 : ')
    
    if str1.lower() == 'quit':
      break

    f.write(f'{str1}\n') # \n 파일 내에서 개행

print('저장되었습니다.')

 

1-5. readline()

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

print(line)

'''
apple
orange
banana
'''

1-6. readlines()

  • 전체라인을 모두 읽어서 각 라인단위로 리스트에 raw string으로 저장
with open('test.txt', 'r') as f:
  lines = f.readlines()
  print(lines)
  
# ['apple\n', 'orange\n', 'banana\n']
for i in lines:
  print(i, end='')
  
'''
apple
orange
banana
'''

2. 인코딩과 디코딩

2-1. 인코딩(Encoding)

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

Home

 

home.unicode.org

 

txt1 = 'Hello Python'
type(txt1) # str
txt2 = txt1.encode('utf-8')
type(txt2) # bytes
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'

2-2. 디코딩(Decoding)

 

Unicode Converter, Unicode Encoding and Decoder

Online Unicode converter, easy to use unicode encoding and decoder tool. Convert plain text to unicode codes and vice versa.

checkserp.com

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')) # 안녕하세요 파이썬
print(txt4.decode('ascii')) # UnicodeDecodeError: 'ascii' codec can't decode byte 0xec in position 0: ordinal not in range(128)

 

'Python' 카테고리의 다른 글

24. 변수 타입 어노테이션  (0) 2023.03.14
23. 클로저와 데코레이터  (0) 2023.03.14
21. 예외 처리  (0) 2023.03.13
20. 모듈  (0) 2023.03.13
19. 스페셜 메소드  (0) 2023.03.10