본문 바로가기
코딩 연습/파이썬 기초(예제)

파이썬 입출력 - input(), open() 함수 사용 방법

by good4me 2023. 12. 4.

goodthings4me.tistory.com

파이썬 입출력 - input(), open() 함수

 

파이썬에서 값을 입력받는 input() 함수와 파일 단위로 입출력하는 open() 함수에 대해 정리한 자료임

 

입력은 키보드나 마우스를 통해 값을 받거나 파일을 읽어오는 것을, 출력은 프린터나 모니터 상으로 값을 내보내고 그 값을 표현하는 것과 파일을 저장하는 것을 말함

 

 파이썬 input() 함수 사용

사용자가 입력한 값을 받는 input() 함수 사용 방법이며, input()으로 입력받은 값의 타입은 문자열

 

 

▶ input()으로 정수, 실수, 문자열 입력 받기

## 입력 값은 문자열 타입
text = input('내용을 입력하세요> ')
print(text, type(text))

### 실행결과 ###
내용을 입력하세요>  사과
사과 <class 'str'>


## 정수를 입력받고 정수 타입으로 변경하기
int1 = input('정수를 입력하세요> ')
int1 = int(int1)
print(int1, type(int1))

### 실행결과 ###
정수를 입력하세요>  234
234 <class 'int'>


## 실수를 입력받고 실수 타입으로 변경하기
float1 = input('실수를 입력하세요> ')
float1 = float(float1)
print(float1, type(float1))

### 실행결과 ###
실수를 입력하세요>  3.14
3.14 <class 'float'>

 

 

▶ 입력 받기 연습

- 두 수를 입력받아 덧셈하기

## 두 숫자를 입력하고 덧셈 결과를 출력하기
num1 = input('첫번째 숫자 입력> ')
num2 = input('두번째 숫자 입력> ')
print(f'{float(num1)} + {float(num2)} = {float(num1) + float(num2)}')

### 실행결과 ###
첫번째 숫자 입력>  20
두번째 숫자 입력>  14.6
20.0 + 14.6 = 34.6

 

 

- 두수 입력받아 사칙연산 계산하고 출력하기

strs = input('아무 숫자나 2개 입력(입력값 구분은 콤마, 예시: 3.14, 3)> ')
print(strs)
strs2 = strs.split(',')
print(strs2)
plus = float(strs2[0].strip()) + float(strs2[1].strip())
minus = float(strs2[0].strip()) - float(strs2[1].strip())
mul = float(strs2[0].strip()) + float(strs2[1].strip())
div = float(strs2[0].strip()) / float(strs2[1].strip())
print(plus, minus, mul, div) 

### 실행결과 ###
아무 숫자나 2개 입력(입력값 구분은 콤마, 예시: 3.14, 3)>  4.24, 53
4.24, 53
['4.24', ' 53']
57.24 -48.76 57.24 0.08

 

- 반복문으로 문자 입력받아 출력하기

## 반복문으로 문자를 입력받고 출력하기 (단, End 문자를 입력받으면 반복 종료)
input_str = []
while True:
    strs = input("문자를 입력하시오(종료: 'q' or 'Q' 입력)> ")
    if strs in ('q', 'Q'):
        print('입력을 종료합니다.')
        break
    if strs not in ('q', 'Q'):
        input_str.append(strs)
        
print(input_str)

for ch in input_str:
    print(ch)

### 실행결과 ###
문자를 입력하시오(종료: 'q' or 'Q' 입력)>  반복문으로
문자를 입력하시오(종료: 'q' or 'Q' 입력)>  문자를
문자를 입력하시오(종료: 'q' or 'Q' 입력)>  입력받고
문자를 입력하시오(종료: 'q' or 'Q' 입력)>  출력하기
문자를 입력하시오(종료: 'q' or 'Q' 입력)>  100번
문자를 입력하시오(종료: 'q' or 'Q' 입력)>  코딩하기
문자를 입력하시오(종료: 'q' or 'Q' 입력)>  q
입력을 종료합니다.
['반복문으로', '문자를', '입력받고', '출력하기', '100번', '코딩하기']
반복문으로
문자를
입력받고
출력하기
100번
코딩하기

 

 

IT, 전자제품 선물

 

 

▶ 파이썬 출력

## 특정 값을 출력하기
num = 123
print(num)
# 123
s = 'python'
print(s)
# python
list1 = [1, 2, 'a', 'b']
print(list1)
# [1, 2, 'a', 'b']
dict1 = {'a': 1, 'b': 2, 'c': 3}
print(dict1)
# {'a': 1, 'b': 2, 'c': 3}

## 콤마(,)를 이용해서 여러 값 출력
print(num, s, list1, dict1)
# 123 python [1, 2, 'a', 'b'] {'a': 1, 'b': 2, 'c': 3}

## 코드의 결과값을 바로 출력
print(1 + 2)
# 3
print([i for i in range(10)])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

## print() 함수의 분리 문자 sep=, 맺음 문자 end= 속성 사용하기
print(1, 2, 3, 4, 5, sep = '/')
# 1/2/3/4/5
print(1, end = ' ')
# 1 
print(2, end = '-')
# 2-
print(3)
# 3

 

 

▣  반복문과 print 함수 사용하여 별표 찍기

## 연습문제 별표 찍기 - 반복문과 print 함수를 사용하여 별표 찍기
for i in range(1, 6):
    for j in range(1, 6):
        if i == j:
            print('*' * i)

### 출력결과 ###
*
**
***
****
*****


for i in range(1, 6):
    for j in range(5, 0, -1):
        if i == j:
            print('*' * i)

### 출력결과 ###
*
**
***
****
*****


for i in range(1, 6):
    for j in range(1, i + 1):
        print('*', end='')
    print()

### 출력결과 ###
*
**
***
****
*****


for i in range(1, 6):
    print('*' * i)

### 출력결과 ###
*
**
***
****
*****

 

cnt = 1
for i in range(5, 0, -1):
    print(f"{' ' * (i-1)}{'*' * cnt}")
    cnt += 1

### 출력결과 ###
    *
   **
  ***
 ****
*****

 

cnt = 0
for i in range(5, 0, -1):
    print(f"{' ' * cnt}{'*' * i}")
    cnt += 1

### 출력결과 ###
*****
 ****
  ***
   **
    *

 

cnt = 0
for i in range(5, 0, -1):
    print(f"{'*' * i}{' ' * cnt}")
    cnt += 1

### 출력결과 ###
*****
**** 
***  
**   
*

 

 

파이썬 open() 함수 사용

파일 입출력 시 많이 활용하는 open() 함수는 파일을 열거나 생성함

파일객체 = open('파일명', 모드)

 

※ 모드의 종류

 

  • r : 읽기 - 파일의 내용을 읽기만 할때 사용(기본값)
  • w / x : 쓰기 - 파일의 내용을 쓰기만 할때 사용
  • a : 추가 - 파일의 마지막 부분에 내용을 추가할 떄
  • + : 읽기/쓰기 + 텍스트/바이너리 r+, w+
  • t : 텍스트 모드(기본값)
  • b : 바이너리(이진) 모드

☞ open()의 디폴트는 r모드이며, 기본 r, w, a와 더불어서 +, t, b를 붙여서 사용할 수 있는데 r+, w+, a+, rt, wt, at, rb, wb, ab 등으로 사용 가능하고, rt, wt, at에서 t는 기본값이기 때문에 생략 가능함

 

 

▶ open() 연습

file = open('test', 'w', encoding='utf-8')
file.close()

### 실행결과 ###
# 현재 폴더에 test 파일이 생성됨


## 파일 쓰기 : w(write, writelines)
file = open('test.txt', 'wt', encoding='utf8')  # 현재 디렉토리에 test.txt 파일 저장
file.write('파일에 저장될 문자\n줄바꿈')
file.close()

### 실행결과 ###
# 현재 폴더에 test.txt 파일이 생성되고, 내용이 저장됨


file = open('./test2.txt', 'wt', encoding='utf8')
file.writelines(['파일에 저장될 문자', '\n', '줄바꿈'])
file.close()

### 실행결과 ###
# 현재 폴더에 test2.txt 파일이 생성되고, 내용이 저장됨


## 파일 쓰기 : a(write, writelines)
file = open('test.txt', 'at', encoding='utf8')
file.write('추가하기\t1')
file.close()

### 실행결과 ###
# 현재 폴더에 test.txt 파일이 생성되고, 추가 내용이 저장됨


file = open('test.txt', 'at', encoding='utf8')
file.write('추가하기\t1')
file.close()

### 실행결과 ###
# 현재 폴더에 test.txt 파일이 생성되고, 내용이 추가 저장됨


file = open('test2.txt', 'at', encoding='utf8')
file.writelines(['추가하기', '\t', '2'])  # 라인(줄) 단위 쓰기
file.close()

### 실행결과 ###
# 현재 폴더에 test2.txt 파일이 생성되고, 내용이 추가 저장됨


## 파일 읽기 : r(read, writelines, writelines)
print('======== 읽기 =========')
file = open('test.txt', 'rt', encoding='utf8')
print(file)  # <_io.TextIOWrapper name='test.txt' mode='rt' encoding='utf8'>
data = file.read()  # 한번에 전체 내용 읽기
print(data)
file.close()

### 실행결과 ###
# ======== 읽기 =========
# <_io.TextIOWrapper name='test.txt' mode='rt' encoding='utf8'>
# 파일에 저장될 문자
# 줄바꿈추가하기	1추가하기	1


## 힌즐씩 읽기
print('\n1.readline -----------')
file = open('test.txt', 'rt', encoding='utf8')
data = file.readline()  # 라인(줄) 단위 읽기, 마지막에 개행(\n)문자 있음
print(data, end='')
data = file.readline()
print(data, end='')
file.close()

### 실행결과 ###
# 1.readline -----------
# 파일에 저장될 문자
# 줄바꿈추가하기	1추가하기	1


## 반복문으로 
print('\n\n2.반복문으로-------')
file = open('test.txt', 'rt', encoding='utf8')
data = ''
while True:
    row = file.readline()
    print(row.strip())  # 개행 \n 제거
    data += row
    if not row:
        break
file.close()

print('3.변수 data 값 :')
print(data)

### 실행결과 ###
# 2.반복문으로-------
# 파일에 저장될 문자
# 줄바꿈추가하기	1추가하기	1

# 3.변수 data 값 :
# 파일에 저장될 문자
# 줄바꿈추가하기	1추가하기	1


## readlines() 사용 - 리스트 타입으로 반환
print('\n4.readlines -------')
file = open('test.txt', 'rt', encoding='utf8')
data = file.readlines()  # 라인(줄) 단위로 모두 읽음(리스트 타입)
print(data, type(data))

for line in data:
    print(line.strip())
file.close()

### 실행결과 ###
# 4.readlines -------
# ['파일에 저장될 문자\n', '줄바꿈추가하기\t1추가하기\t1'] <class 'list'>
# 파일에 저장될 문자
# 줄바꿈추가하기	1추가하기	1


## 자동 close - with Context
print('\n5.with Context 사용 -------')
with open('test.txt', 'rt', encoding='utf8') as f:
    data = f.read()
    print(data)

### 실행결과 ###
# 5.with Context 사용 -------
# 파일에 저장될 문자
# 줄바꿈추가하기	1추가하기	1

 

 

 

▣ 파일 입출력 관련 연습

## 예제) 04_numbers_data.txt의 내용을 읽고 숫자들의 합 구하기

'''  04_numbers_data.txt
7
9
24
29
34
38

'''

with open('./04_numbers_data1.txt', 'rt', encoding='utf-8') as f:
    tot = 0
    while True:
        line = f.readline()
        # print(repr(line))
        num = line.strip()
        if not line:
            break
        tot += int(num)
    print(tot)

### 실행결과 ###
141

 

## 예제) 04_numbers_data2.txt의 내용을 읽고 알파벳 t가 포함된 단어만 출력하기

''' 04_numbers_data2.txt
python
java
c++
go
kotlin
react

'''

with open('./04_numbers_data2.txt', 'rt', encoding='utf-8') as f:
    chars = f.readlines()
    for ch in chars:
        if ch.find('t') > 0:
            print(ch.strip())

### 실행결과 ###
python
kotlin
react

 

 

▣ with open() 사용하여 파일을 읽고, 다시 저장하는 문제

 

연습 텍스트 파일
연습 텍스트 파일

 

위 파일을 읽어서 남성, 여성별로 추출하여 각각 남성.txt와 여성.txt 파일로 저장(with open() 사용)

(단, 위 파일의 구분자는 탭(\t)으로 되어있는 것을 공백으로 구분하여 저장해야 함)

데이터.txt
0.00MB

 

 

with open('./데이터.txt', 'r', encoding='utf-8') as f:
    mans = []
    womans = []
    
    for line in f.readlines():
        line_clear = line.strip()
        # print(line_clear)
        items = line_clear.split('\t')
        # print(item)
        
        if items[2] == '남성':
            mans.append(' '.join(items))
            
        elif items[2] == '여성':
            womans.append(' '.join(items) + '\n')

    if mans:
        with open('./남성.txt', 'a') as f_man:
            for elem in mans:
                f_man.write(elem + '\n')
    if womans:
        with open('./여성.txt', 'w') as f_woman:
            # for elem in womans:
            f_woman.writelines(womans)
                
    print(mans)
    print(womans)
    
### 실행결과 ###
['bbb 30 남성 경기도 분당구', 'ddd 28 남성 대구시 중구', 'fff 26 남성 광주시 서구', 'hhh 24 남성 경북 포항시', 'jjj 27 남성 충북 청주시']
['aaa 25 여성 서울시 강남구\n', 'ccc 22 여성 인천시 남동구\n', 'eee 35 여성 부산시 해운대구\n', 'ggg 31 여성 대전시 유성구\n', 'iii 29 여성 전남 목포시\n']

# 폴더에 남성.txt, 여성.txt 파일 생성됨

 

  • 텍스트를 readlines()로 읽고 for 문으로 순환하면서 각 라인(줄)의 구분자 탭(\t)을 split() 처리 후
  • 남성/여성 구분을 위해 인덱스 2번째를 조건 분기처리하였고,
  • 리스트를 공백으로 구분한 문자열로 만들기 위해 join() 함수 사용하여 mans, womans 리스트에 추가함
  • 그리고, with open()을 사용하여 남성 리스트는 write()로, 여성 리스트는 writelines()로 저장함

 

생성된 파일 내용
생성된 파일 내용

 

 

댓글