[Python기초]File In&out 연습

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!


파이썬 파일 입출력 연습문제


문제1: 텍스트파일로 되어 있는 가사의 단어를 카운트하자.


비틀즈의 ‘Yesterday’ 아시나요? 정말 유명한 곡인데요. 이 곡의 가사가 저장되어 있는 텍스트 파일을 읽어 가사에 사용되고 있는 단어들의 목록을 알파벳 순서로 출력하고, 각 단어들이 몇 개씩 사용되고 있는지 단어별 개수를 출력하는 프로그램을 작성해봅시다.


조건

  1. 리스트, 세트, 딕셔너리 등의 자료구조를 이용
  2. 단어들은 모두 소문자로 변환하여 사용한다.
  • 텍스트 파일과 출력 예시:

    image


풀이

과정을 생각해보면 이정도로 정리해 볼 수 있다.

  1. yesterday.txt 파일을 읽어온다.
  2. 소문자로 변환하여 단어로 나눠준다.
  3. 카운트를 계산
  4. 화면에 출력

이제 코드를 작성해서 프로그램을 구현해보자.

f = open('yesterday.txt', 'r') # 읽기모드로 텍스트 파일을 불러온다.
yesterday = f.readlines() # readlines() 메소드는 텍스트를 행 별로 리스트에 저장
# yesterday2 = f.read() # read() 메소드를 사용하면 문자열로 들어온다. 바로 스플릿을 할 수도 있다.
f.close() # 파일을 닫아준다.
words = [] # 단어 크기로 나눠진 문자들을 담아줄 리스틀 생성한다.
for line in yesterday:
    line = line.split()
    for w in line:
        words.append(w.lower()) # 소문자로변경하여 words에 append
# 반복문을 사용해 yesterday 리스트를 .split() 메소드를 사용해 단어로 나눠준다.
# 그리고 다시 이중 반복문을 이용해서 lower()메소드를 사용해 단어를 소문자로 바꿔주고 words에 append해준다.
wordL = list(set(words)) 
# 중복되는 단어들을 집합으로 만들어 요소 하나씩만 남게한 다음 다시 리스트로 만든다.
wordL.sort() 
# 그 리스트를 알파벳 오름차순으로 정렬해준다.

wordDict = dict()
# 단어와 단어의 개수를 담기 위한 딕셔너리를 생성
for w in wordL:
    wordDict[w] = words.count(w)
# 단어의 중복을 없앤 리스트를 반복문을 이용해 딕셔너리의 key값에 넣어준다.
# 단어의 중복이 있는 words 리스트에서 .count() 메소드를 사용해 단어의 개수를 카운트하고 value값에 저장해준다.

for w in wordDict.items():
    print(f"'{w[0]}' : {w[1]}")
# 반복문을 사용해 딕셔너리의 key값(단어)과 value값(개수)를 출력
'a' : 3
'all' : 1
'an' : 2
'as' : 1
'away' : 3
'be' : 1
'believe' : 3
'came' : 1
'don't' : 2
'easy' : 2
'far' : 1
'for' : 2
'game' : 2
'go,' : 2
'had' : 2
'half' : 1
'hanging' : 1
'here' : 1
'hide' : 2
'i' : 12
'i'm' : 1
'in' : 3
'it' : 1
'know' : 2
'long' : 2
'looks' : 1
'love' : 2
'man' : 1
'me' : 1
'my' : 1
'need' : 2
'not' : 1
'now' : 5
'oh,' : 4
'over' : 1
'place' : 2
'play' : 2
'said' : 2
'say' : 2
'seemed' : 1
'shadow' : 1
'she' : 4
'so' : 1
'something' : 2
'stay' : 1
'such' : 2
'suddenly' : 2
'the' : 1
'there's' : 1
'they're' : 1
'though' : 1
'to' : 8
'troubles' : 1
'used' : 1
'was' : 2
'why' : 2
'wouldn't' : 2
'wrong' : 2
'yesterday' : 9

단어 별로 개수가 정렬되어 잘 출력된 것을 확인할 수 있다. 하지만 oh 뒤에 ‘,’가 있는 것을 볼 수 있다.

저 문제들을 처리하면서 동시에 코드를 줄여볼 수도 있다.

with open('yesterday.txt', 'r') as f:
    yesterday = f.read().lower().replace(',', '')
    yesterday = yesterday.split()
    wordDict = {}
    words = sorted(list(set(yesterday)))
# with 함수를 사용하면 close()가 자동으로 된다.
# .read()메소드는 리스트가 아닌 문자열로 텍스트 파일을 추출해온다.
# lower로 문자열들을 소문자로 변환
# replace로 ,를 공백으로 처리
# split을 활용해 각 단어를 list로 처리
# wordDict라는 딕셔너리를 생성
# yesterday 리스트를 집합으로 변환시켜 중복 제거 후 리스트로 변환하고 정렬시켜 words에 저장

for w in words:
    wordDict[w] = yesterday.count(w)
    
# 반복문을 활용해 words의 단어를 딕셔너리 key값에 저장해주고 .count()를 이용해 해당 key값의 개수를 value값에 저장.

for w in wordDict.items():
    print(f"'{w[0]}' : {w[1]}")

# wordDict의 값들을 출력
'a' : 3
'all' : 1
'an' : 2
'as' : 1
'away' : 3
'be' : 1
'believe' : 3
'came' : 1
'don't' : 2
'easy' : 2
'far' : 1
'for' : 2
'game' : 2
'go' : 2
'had' : 2
'half' : 1
'hanging' : 1
'here' : 1
'hide' : 2
'i' : 12
'i'm' : 1
'in' : 3
'it' : 1
'know' : 2
'long' : 2
'looks' : 1
'love' : 2
'man' : 1
'me' : 1
'my' : 1
'need' : 2
'not' : 1
'now' : 5
'oh' : 4
'over' : 1
'place' : 2
'play' : 2
'said' : 2
'say' : 2
'seemed' : 1
'shadow' : 1
'she' : 4
'so' : 1
'something' : 2
'stay' : 1
'such' : 2
'suddenly' : 2
'the' : 1
'there's' : 1
'they're' : 1
'though' : 1
'to' : 8
'troubles' : 1
'used' : 1
'was' : 2
'why' : 2
'wouldn't' : 2
'wrong' : 2
'yesterday' : 9

이렇게 잘 출력될 것이다.






문제2: 파일을 읽어와서 연산 후 파일에 저장

한 줄에 두 개의 숫자가 저장되어 있는 파일을 읽어와 한 줄의 두 숫자를 더한 후 연산 결과를 파일로 내보내는 프로그램을 작성해보자.

조건

  1. 파일을 읽어오고 파일에 쓰고, 숫자에 대해 연산하는 기능은 함수 sum()을 정의하여 사용한다.

    sum(inputfile 객체, 저장파일명)

  2. 메인에서는 해당 함수를 호출해서 수행

  • 텍스트 파일과 출력 예시:

    • 입력 파일 명(‘list_num.txt’)
    • 저장 파일 명(‘list_calcul.txt’)

    image

풀이

과정을 간략히 생각해보자.

  1. ‘list_num.txt’ 파일 읽어오기
  2. 두 수의 합을 구하는 연산하기
  3. ‘list_calcul.txt’ 파일에 쓰기
  4. sum()함수로 만들어버리기
  5. 파일 명을 변수에 저장해 객체에 넣는다.
  6. main 함수에서만 실행되게 한다.

이제 차근차근 풀어보자!

with open('list_num.txt', 'r') as f:
    data = f.readlines()
# 'list_num.txt' 파일을 읽기 모드로 불러온다.
# with문을 사용해 간단하게 코드를 작성함과 동시에 close()처리를 따로 하지 않아도 된다.
# 내용을 전부 읽어서 행별로 data 리스트에 담아준다.
with open('list_calcul.txt', 'w') as f:
    for d in data:
        if d.replace('\n', '') != '': 
           value1, value2= d.split()
           result = int(value1) + int(value2) 
           f.write(f'{value1} + {value2} = {result}\n') 
        else:
            continue
            
# with문을 사용해 쓰기 모드('w')로 'list_calcul.txt' 파일을 생성
# 반복문을 사용해 data리스트에 있는 요소들에 대한 수행문을 작성한다.
# 해당 텍스트파일을 보면 두 줄에 한 줄씩 빈 줄이있다.
# 만약 요소들의 줄바꿈을 공백으로 바꿨을때, 요소가 공백이 아니라면 d를 split()으로 나눠 value1과 2에 언패킹을 해준다.
# 그리고 value1과 value2에 저장된 값을 정수형으로 변환시켜주고 result에 합을 저장해준다.
# .write()메소드를 사용해 출력 예시처럼 입력해준다.
   

해당 코드를 실행시키면 ‘list_calcul.txt’ 파일이 생성되었을 것이고, 내용을 확인하면

50 + -15 = 35
61 + 33 = 94
436 + -666 = -230
63 + 16 = 79
95 + 55 = 150
-35 + -36 = -71
-3 + 32 = 29
-62 + 100 = 38

이렇게 잘 작성되어 있을 것이다.

하지만, 이 과정을 함수화 시키고 main에서만 작동하게 하는 과정이 남아있다.

def sum(input_file, output_file):
    with open(input_file, 'r') as f: 
        data = f.readlines()

    with open(output_file, 'w') as f:
        for d in data:
            if d.replace('\n', '') != '': 
                value1, value2= d.split() 
                result = int(value1) + int(value2) 
                f.write(f'{value1} + {value2} = {result}\n') 
            else:
                continue
                
# 위 과정과 코드는 같다.
# 다만 def로 sum 함수를 정의해줘야한다.
# 그리고 직접 with문에 직접적으로 적어주었던 파일명을 각각 input_file, output_file로 매개변수로 변경해준다.
if __name__ == '__main__': 
    # main : 프로그램 실행 코드
    sum('list_num.txt', 'list_calcul.txt')
    
# 마지막으로 main에서 해당 함수를 호출해서 수행하고, sum함수를 실행해보자!







문제3: 회원 명단 프로그램

회원 명단을 입력받아 저장하거나, 회원명단파일을 열어 저장되어 있는 회원 명단을 출력하는 프로그램을 작성해보자.

조건

  1. 회원명단을 입력받아 파일로 저장하는 함수를 작성(input_member(input_file명)))

    • 함수의 매개변수는 명단을 저장할 파일명
    • 사용자로부터 명단을 입력받고 저장이 완료된 후 ‘저장되었습니다’를 출력
    • 명단입력은 q키를 누를때까지 계속 작업
  2. 사용자가 입력한 파일을 열어서 출력해주는 함수 작성(output_member(output_file명))

    • 함수의 매개변수는 회원명단이 있는 파일명
    • 전달된 파일명을 이용하여 파일에 들어있는 데이터를 출력
  3. 메인에서는 실행결과와 같이 선택한 작업에 해당하는 함수를 호출하여 수행

    • q를 입력할 때까지 실행은 무한 반복
    • 사용자에게 ‘저장 1, 출력 2, 종료 q’ 중에서 선택하게 함
    • 전달된 파일명을 이용하여 파일에 들어있는 데이터를 출력
  4. 출력 예시:

    image

풀이

(1) 회원명단을 입력받아 파일로 저장하는 함수 작성

def input_member(input_file):
    with open(input_file, 'w', encoding='utf-8') as f:
        while True:
            member = input('멤버를 입력하세요. (종료는 q) : ')
            if member == 'q':
                break
            else:
                f.write(member+'\n')
                
# 회원명단을 입력받아 저장하는 파일의 매개변수로 input_file을 적어준다.
# with문을 사용해 저장할 파일을 생성해주고 한글이 들어가기 때문에 인코딩을 utf-8로 지정.
# 명단입력은 q키를 누를때까지 계속 작업되기 때문에 while문을 사용한다.
# 입력받는 member가 q일 때 break를 이용해 해당 프로그램을 종료시켜준다.
# 그 외에는 member에 받은 회원명단을 input_file에 적어주는 .write()메소드를 적용한다.

(2) 사용자가 입력한 파일을 열어서 출력해주는 함수 작성

def output_member(output_file):
    with open(output_file, 'r', encoding='utf-8') as f:
        print(f.read())
# 읽기 모드로 불러올 파일의 객체명을 output_file로 작성
# 똑같이 한글을 사용하기 때문에 utf-8 인코딩 적용
# .read() 메소드를 사용해 텍스트의 내용을 문자열로 전부 읽어준다.

(3) 메인에서는 실행결과와 같이 선택한 작업에 해당하는 함수를 호출하여 수행

while True:
    sel = input('저장 1, 출력 2, 종료 q : ')
    if sel == '1':
        input_file = input('멤버 명단을 저장할 파일명을 입력하세요. : ')
        input_member(input_file)
        print('저장되었습니다.')
    elif sel == '2':
        output_file = input('멤버 명단이 저장된 파일명을 입력하세요. : ')
        output_member(output_file)
    elif sel == 'q':
        break
    else:
        print('잘못 입력하셨습니다.')

# q를 입력하기 전 까지 무한 반복이니까 while문을 사용
# input을 사용해 사용자가 '저장 1, 출력 2, 종료 q' 중에서 선택하게 만든다.
# sel는 select(선택)이라는 뜻의 변수


# 만약 1을 입력하면 파일명을 정할 수 있다.
# 그리고 회원명을 적을 수 있는 input_member 함수가 실행되며, 입력한 파일명의 파일에 저장된다.

# 만약 2를 입력하면 이전에 이미 저장되어있는 회원명단 파일명을 적어야 한다.
# 파일명을 제대로 적으면, 회원들의 이름을 전부 출력해준다.


# 만약 q를 입력하면 프로그램이 종료된다.

한번 실행해서 출력결과를 확인해보자.

저장 1, 출력 2, 종료 q : 1
멤버 명단을 저장할 파일명을 입력하세요. : goodjeon.txt
멤버를 입력하세요. (종료는 q) : 전동준
멤버를 입력하세요. (종료는 q) : 손흥민
멤버를 입력하세요. (종료는 q) : 박지성
멤버를 입력하세요. (종료는 q) : 차범근
멤버를 입력하세요. (종료는 q) : 귀도 반 로섬
멤버를 입력하세요. (종료는 q) : 스티븐 잡스
멤버를 입력하세요. (종료는 q) : q
저장되었습니다.
저장 1, 출력 2, 종료 q : 2
멤버 명단이 저장된 파일명을 입력하세요. : goodjeon.txt
전동준
손흥민
박지성
차범근
귀도 반 로섬
스티븐 잡스

저장 1, 출력 2, 종료 q : q

Process finished with exit code 0

텍스트파일도 확인해 보자.

image

2022

[web]jQuery 복습 3

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

16 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

9 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑