[제로베이스_데이터 취업 스쿨 16기](6/16 ~ 18) - 텍스트 파일 다루기

jumee·2023년 6월 20일
0
post-thumbnail

중급 연습 문제풀이 - 텍스트 파일 다루기

파이썬의 텍스트 파일 다루는 문법과 관련된 문제 풀이

EX 1. 회원 계정별 텍스트 파일을 생성한 후 회원 본인 파일에 ‘한 줄 일기’를 쓰고 읽는 프로그램을 만들자.

# diary.py

# 일기 기능을 가지고 있는 공동 모듈을 만들자.
# 1. 읽기
# 2. 쓰기
import time
def writeDiary(u,f,d): # 사용자가 입력한 문자열 매개변수 d, 파일 경로(url + file name)를 받고
    lt = time.localtime()
    timeStr = time.strftime('%Y-%m-%d %I:%M:%s %p', lt) # 먼저 현재 시간 정보를 문자형식으로 가져오고

    filePath = u + f
    with open(filePath, 'a') as f:
        f.write(f'[{timeStr}]  {d}\n')

def readDiary(u,f):

    filePath = u + f
    datas = []
    with open(filePath, 'r') as f:
        datas = f.readlines() # 여러 줄을 한꺼번에 읽기

    return datas
import diary

members = {}
uri = '/Users/sunju/PycharmProjects/python/text'

# 회원 정보를 출력해주는 함수를 만들자
def printMembers():
    for m in members.keys():
        print(f'ID : {m}\t PW: {members[m]}')

while True:
    selectNum = int(input('1.회원 가입  2. 한줄일기쓰기  3.일기보기  4.종료'))

    if selectNum == 1: # 회원가입이라면
        # 회원 아이디와 비밀번호를 입력받자
        id = input('id: ')
        pw = input('pw: ')
        members[id] = pw
        printMembers()

    elif selectNum == 2:
        id = input('id: ')
        pw = input('pw: ')
        if id in members and members[id] == pw:
            print('Login success!')
            fileName = 'myDiary_' + id + '.txt'
            content = input('오늘 하루 일어난 일들을 기록해보세요.')
            diary.writeDiary(uri,fileName,content)
        else:
            print('Login fail!')
            printMembers()

    elif selectNum == 3:
        id = input('id: ')
        pw = input('pw: ')
        if id in members and members[id] == pw:
            print('Login success!')
            fileName = 'myDiary_' + id + '.txt'
            datas = diary.readDiary(uri, fileName)
            for d in datas:
                print(d, end='')
        else:
            print('Login fail!')
            printMembers()

    elif selectNum == 4:
        print('Bye~')
        break

EX 2. 텍스트 파일에 수입과 지출을 기록하는 가계부를 만들자.

# 잔고와 입금 내역을 관리하는 두가지 텍스트 파일을 만들어줘야 한다.
import time

# 시간을 조정해주는 함수
def getTime():
    d = time.localtime()
    st = time.strftime('%Y-%m-%d %H:%M:%S')
    return st

while True:

    selectNum = int(input('1.입금,  2.출금,  3.종료'))

    if selectNum == 1: # 입금
        money = int(input('입금액 입력: '))

        with open('/Users/sunju/PycharmProjects/python/text/bank/money.txt', 'r') as f: # 잔고 먼저 읽기
            m = f.read()

        with open('/Users/sunju/PycharmProjects/python/text/bank/money.txt', 'w') as f: # 잔고 + 입금 쓰기
            m = f.write(str(int(m) + money))

        memo = input('입금 내역 입력: ') # 어떻게 수입이 생겼는지에 대한 정보
        with open('/Users/sunju/PycharmProjects/python/text/bank/pocketMoneyRegister.txt', 'a') as f: # 입금 내역은 덧붙여져야 하므로
            f.write('---------------------------------------------------------\n')
            f.write(f'{getTime()} \n')
            f.write(f'[입금] {memo} : {str(money)}원 \n')
            f.write(f'[잔액] : {str(int(m) + money)}원 \n')

        print('입금 완료!')
        print(f'기존 잔액: {m}')
        print(f'입금 후 잔액: {int(m) + money}')

    elif selectNum == 2:
        money = int(input('출금액 입력: '))

        with open('/Users/sunju/PycharmProjects/python/text/bank/money.txt', 'r') as f:  # 잔고 먼저 읽기
            m = f.read()

        with open('/Users/sunju/PycharmProjects/python/text/bank/money.txt', 'w') as f:  # 잔고 - 출금 쓰기
            m = f.write(str(int(m) - money))

        memo = input('출금 내역 입력: ')  # 출금 내역에 대한 정보
        with open('/Users/sunju/PycharmProjects/python/text/bank/pocketMoneyRegister.txt',
                  'a') as f:  # 입금 내역은 덧붙여져야 하므로
            f.write('---------------------------------------------------------\n')
            f.write(f'{getTime()} \n')
            f.write(f'[출금] {memo} : {str(money)}원 \n')
            f.write(f'[잔액] : {str(int(m) - money)}원 \n')

        print('출금 완료!')
        print(f'기존 잔액: {m}')
        print(f'출금 후 잔액: {int(m) - money}')

    elif selectNum == 3:
        print('Bye~')
        break

    else: # 1,2,3 이외에 다른 것을 입력했을 때
        print('잘못 입력했습니다. 1,2,3 에서 선택해주세요')
        continue


EX 3. 사용자가 입력한 숫자의 약수를 텍스트 파일에 기록하고, 입력한 숫자까지의 소수를 텍스트 파일에 기록하자.

# 약수

inputNum = int(input('0보다 큰 정수를 입력: '))

divisor = []
for num in range(1,(inputNum + 1)):
    if inputNum % num == 0:
        divisor.append(num)

if len(divisor) > 0:
    try:
        with open('/Users/sunju/PycharmProjects/python/text/divisor.txt', 'a') as f:
            f.write(f'{inputNum}의 약수: ')
            f.write(f'{divisor}\n')
    except Exception as e:
        print(e)
    else:
        print('divisor written successfully!')

# 소수

inputNum = int(input('0보다 큰 정수 입력: '))

prime = []
cnt = 0
for num in range(2,(inputNum + 1)): # 1은 소수에 포함될 수 없다.
		flag = True
		for n in range(2,num):
			  if num % n == 0: # 소수가 아닐 경우
						flag = False
						break

		if flag:
				prime.append(num)
				
if len(prime) > 0:
    try:
        with open('/Users/sunju/PycharmProjects/python/text/prime .txt', 'a') as f:
            f.write(f'{inputNum}까지의 소수: ')
            f.write(f'{prime}\n')
    except Exception as e:
        print(e)
    else:
        print('prime written successfully!')

EX 4. 두 개의 수를 입력하면 공약수를 텍스트 파일에 작성하는 프로그램을 만들자.

# 두개의 수를 입력받는다.

n1 = int(input('1보다 큰 정수 입력: '))
n2 = int(input('1보다 큰 정수 입력: '))

# 두 값의 공약수를 계산
result = []
min_num = min(n1,n2)
for i in range(1,(min_num+1)):
    if n1 % i == 0 and n2 % i == 0: # 두 값에서 모두 나눠떨어진다고 하면
        result.append(i)
if len(result) > 0:
		try:
				with open('/Users/sunju/PycharmProjects/python/text/ex.txt', 'a') as f:
					   f.write(f'{n1}{n2}의 공약수: {result}\n')

		except Exception as e:
				print(e)
		
		else:
				print('common factor written completed!')
				
# 최대공약수 구해보기

n1 = int(input('1보다 큰 정수 입력: '))
n2 = int(input('1보다 큰 정수 입력: '))

maxComNum = 0
min_num = min(n1,n2)
for i in range(1,(min_num+1)):
    if n1 % i == 0 and n2 % i == 0:
        maxComNum = i # 계속 변경되면서 최대공약수를 구할 수 있게 된다.

try:
    with open('/Users/sunju/PycharmProjects/python/text/ex1.txt', 'a') as f:
        f.write(f'{n1}{n2}의 최대공약수: {maxComNum}\n')

except Exception as e:
    print(e)

else:
    print('common max factor written completed!')
# 3개 값의 최대 공약수 구해보기

EX 5. 섬마을에 과일, 생선, 야채를 판매하는 배가 다음 주기로 입항한다고 할 때, 모든 배가 입항하는 날짜를 텍스트 파일에 기록해보자.

(첫 입항일은 2021년 1월 1일 오전 10시라고 하자)

  • 과일 선박 : 3일 주기 / 생선 선박: 4일 주기 / 야채 선박 : 5일 주기

최소공배수를 이용한다.

ship1 = 3
ship2 = 4
ship3 = 5
max_day = 0
# 2개의 값에서 최대 공약수 구하기
for i in range(1, (ship1 + 1)):
    if ship1 % i == 0 and ship2 % i == 0:
        max_day = i

# 2개의 값에서 최소 공배수 구하기
min_day = (ship1 * ship2) // max_day

new_day = min_day

# 3개의 값에서 최대 공약수 구하기
for i in range(1,(new_day + 1)):
    if new_day % i == 0 and ship3 % i == 0:
        max_day = i

# 3개의 값에서 최소 공배수 구하기
min_day = (new_day * ship3) // max_day

print(f'세 배의 최대공약수: {max_day}')
print(f'세 배의 최소공배수: {min_day}')

from datetime import datetime, timedelta

n = 1
# 기준일 설정해주기
baseTime = datetime(2021,1,1,10,0,0)

with open('/Users/sunju/PycharmProjects/python/text/arrive.txt', 'a') as f:
    f.write(f'{baseTime}\n')

# 기준일로부터 60일 지난 날짜
while True:
    nextTime += timedelta(days=min_day) # 60이라는 값을 날짜 형식으로 더해줄 때, timedelta() 함수를 사용한다. 
    if nextTime.year > 2021:
        break
    with open('/Users/sunju/PycharmProjects/python/text/arrive.txt', 'a') as f:
        f.write(f'{nextTime}\n')

🔜 다음 스터디 노트..

다음 스터디 노트에서는 기초 수학 에 활용되는 대표적인 수학 개념들과 파이썬으로 구현해보는 연습을 진행하고 정리해보도록 한다.

profile
공부한 내용들에 대해 끄적이는 공간입니다💎

0개의 댓글