[10일차] 파이썬 중급문풀7~8

하은·2023년 10월 27일
0

텍스트파일

텍스트 파일 읽기/쓰기 프로그래밍

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

  • diary
import time

def writeDiary(u, f, d):
    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
  • ex
import diary

members = {} #id, pw 관리해야해서
uri ='C:/Users/User/Desktop/python_ex/pythonTxt/'
def printMembers():
    for m in members.keys():
        print(f'id: {m}, pw: {members[m]}')
while True:
    selectNum = int(input('1.회원가입, 2.한줄읽기쓰기, 3.일기보기, 4.종료'))

    if selectNum == 1:
        mId = input('input id: ')
        mPw = input('input pw: ')
        members[mId] = mPw

    elif selectNum == 2:
        mId = input('input id: ')
        mPw = input('input pw: ')

        if mId in members and members[mId] == mPw:
            print('login success')
            filename = 'myDiary_' + mId + '.txt'
            data = input('오늘 하루 인상깊은 일을 기록하세요. ')
            diary.writeDiary(uri, filename, data)
        else:
            print('login fail')
            printMembers()

    elif selectNum == 3:
        mId = input('input id: ')
        mPw = input('input pw: ')

        if mId in members and members[mId] == mPw:
            print('login success')
            filename = 'myDiary_' + mId + '.txt'
            datas = diary.readDiary(uri, filename)
            for d in datas:
                print(d, end='')

        else:
            print('login fail')
            printMembers()
    elif selectNum == 4:
        print('bye')
        break

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

  • 수입, 지출 이력관리 텍스트파일
  • 잔액관리 텍스트 파일
import time
def getTime():
    lt = time.localtime()
    st = time.strftime('%Y-%m-%d %H:%M:%S')
    return st
while True:

    selectNumber = int(input('1.입금, \t2.출금, \t3.종료'))

    if selectNumber == 1:
        money = int(input('입금액 입력: '))
        with open('C:/Users/User/Desktop/python_ex/pythonTxt/bank/money.txt', 'r') as f:
            m = f.read() #잔고

        with open('C:/Users/User/Desktop/python_ex/pythonTxt/bank/money.txt', 'w') as f:
            f.write(str(int(m) + money)) #잔고 덮어씌워야

        memo = input('입금 내역 입력: ')
        with open('C:/Users/User/Desktop/python_ex/pythonTxt/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 selectNumber == 2:
        money = int(input('출금액 입력: '))
        with open('C:/Users/User/Desktop/python_ex/pythonTxt/bank/money.txt', 'r') as f:
            m = f.read() #잔고

        with open('C:/Users/User/Desktop/python_ex/pythonTxt/bank/money.txt', 'w') as f:
            f.write(str(int(m) - money)) #잔고 덮어씌워야

        memo = input('출금 내역 입력: ')
        with open('C:/Users/User/Desktop/python_ex/pythonTxt/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 selectNumber == 3:
        print('bye')
        break
    else:
        print('다시 입력하세요')
        
-->
- money
290000


- pocketMoneyRegister
---------------------------------
2023-10-27 21:17:24 
[입금] 월급: 300000원 
[잔액] : 300000원 
---------------------------------
2023-10-27 21:17:29 
[출금] 냠: 10000원 
[잔액] : 290000원 

money.txt 에 0을 넣어놔야한다는 걸 몰라서 오랜시간 헤맸다


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

#약수

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

divisior = []
for number in range(1, (inputNumber + 1)):
    if inputNumber % number == 0:
        divisior.append(number)

if len(divisior) > 0:
    try:
        with open('C:/Users/User/Desktop/python_ex/pythonTxt/divisior.txt', 'a') as f:
            f.write(f'{inputNumber}의 약수: ')
            f.write(f'{divisior} \n')
    except Exception as e:
        print(e)
    else:
        print('divisior write complete')
        
-->

25의 약수: [1, 5, 25] 

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

#소수

inputNumber = int(input('0보다 큰 정수 입력: '))
prime = []
for number in range(2, (inputNumber + 1)):
    flag = True
    for n in range(2, number):
        if number % n == 0:
            flag = False
            break
    if flag:
        prime.append(number)
if len(prime) > 0:
    try:
        with open('C:/Users/User/Desktop/python_ex/pythonTxt/prime.txt', 'a') as f:
            f.write(f'{inputNumber}까지의 소수: ')
            f.write(f'{prime} \n')
    except Exception as e:
        print(e)
    else:
        print('prime write complete')
        
-->

25까지의 소수: [2, 3, 5, 7, 11, 13, 17, 19, 23] 

5. 두 개의 수를 입력 후 공약수를 텍스트 파일에 작성해보자

# 두개의 수의 공약수

num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))

common = [] #공약수는 리스트에 저장
for i in range(1, (num1 + 1)):
    if num1 % i == 0 and num2 % i == 0:
        common.append(i)

if len(common) > 0: #공약수를 찾았다면
    try:
        with open('C:/Users/User/Desktop/python_ex/pythonTxt/common.txt', 'a') as f:
            f.write(f'{num1}과 {num2}의 공약수: ')
            f.write(f'{common}\n')

    except Exception as e:
        print(e)
    else:
        print('common factor write complete')
        
-->

10과 15의 공약수: [1, 5]
50과 60의 공약수: [1, 2, 5, 10]
112과 200의 공약수: [1, 2, 4, 8]

6. 두 개의 수를 입력 후 최대공약수를 텍스트 파일에 작성해보자

#수 두개의 최대공약수
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
maxComNum = 0
for i in range(1, (num1 + 1)):
    if num1 % i == 0 and num2 % i == 0:
        maxComNum = i


try:
    with open('C:/Users/User/Desktop/python_ex/pythonTxt/maxComNum.txt', 'a') as f:
        f.write(f'{num1}과 {num2}의 최대공약수: {maxComNum}\n')
except Exception as e:
    print(e)
else:
    print('max common factor write complete')
    
-->

10과 15의 최대공약수: 5
50과 60의 최대공약수: 10
112과 200의 최대공약수: 8

+숫자 세개의 공약수, 최대공약수도 해보기!


7. 섬마을에 과일, 생선, 야채를 판매하는 배가 다음 주기로 입항한다고 할 때, 모든 배가 입항하는 날짜를 텍스트 파일에 기록해보자(첫 입항일은 2021년 1월 1일 오전 10시로 한다)

  • 과일선박: 3일 주기
  • 생선선박: 4일 주기
  • 야채선박: 5일 주기
ship1 = 3
ship2 = 4
ship3 = 5
maxDay = 0

#3개의 최대공배수 구하면 되는데, 두개꺼 먼저 구한 값과 그 다음 숫자랑 같이 계산하면 됨
for i in range(1, (ship1 + 1)):
    if ship1 % i == 0 and ship2 % i == 0: #공약수
        maxDay = i #최대공약수
minDay = (ship1 * ship2) // maxDay #최소공배수

newDay = minDay
for i in range(1, (newDay + 1)):
    if newDay % i == 0 and ship3 % i == 0:
        maxDay = i #3개 수의 최대공약수

minDay = (newDay * ship3) // maxDay #3개 수의 최소공배수 = 60일마다 배가 들어옴

print(f'minDay: {minDay}')
print(f'maxDay: {maxDay}')

from datetime import datetime
from datetime import timedelta # = 기존 숫자에 숫자가 더해진 만큼의 해당날짜 구해줌

n = 1
baseTime = datetime(2021, 1, 1, 10, 0, 0) #기준시간이 년월일 시분초

with open('C:/Users/User/Desktop/python_ex/pythonTxt/arrive.txt', 'a') as f:
    f.write(f'2021년 모든 선박 입항일\n')
    f.write(f'{baseTime} \n')

#1월 1일부터 60일이 지난 날짜
nexttime = baseTime + timedelta(days=minDay)
while True:
    with open('C:/Users/User/Desktop/python_ex/pythonTxt/arrive.txt', 'a') as f:
        f.write(f'{nexttime}\n')

    nexttime += timedelta(days=minDay)
    if nexttime.year > 2021:
        break

0개의 댓글