📌 파이썬 연습문제 [텍스트파일]
📋 텍스트 파일 읽기/쓰기
import datetime
import time
path = "C:/Users/YUN/Python/"
💡클래스 User
class User:
def __init__(self, id, pw):
self.id = id
self.pw = pw
self.diary = ''
💡클래스 ManagerUser
class ManagerUser:
def __init__(self):
self.users = {}
def join(self, user):
if user.id in self.users:
print(f'{user.id}는 이미 존재하는 ID 입니다.')
else:
self.users[user.id] = user
for id in self.users.keys():
allUser = self.users[id]
print(f'ID : {allUser.id}\t | \tPW : {allUser.pw}')
def writeDiary(self, user):
if user.id in self.users:
checkUser = self.users[user.id]
if checkUser.pw == user.pw:
print('\t Login Success \t')
lt = time.localtime()
timeStr = time.strftime('%Y-%m-%d %I:%M:%S %p', lt)
txt = input('오늘 하루 인상 깊은 일을 기록하세요 : ')
with open(path + f'_{user.id}.txt', 'a') as file:
file.write(f'[{timeStr}] {txt}\n')
user.diary = f'{path}_{user.id}.txt'
self.users[user.id] = user
else:
print(f'올바르지 않은 패스워드입니다.')
else:
print(f'{user.id} 존재하지 않는 ID 입니다')
def viewDiary(self, user):
if user.id in self.users:
checkUser = self.users[user.id]
if checkUser.pw == user.pw:
print('\t Login Success \t')
with open(checkUser.diary, 'r') as file:
line = file.readline()
while line != '':
print(line)
line = file.readline()
else:
print(f'올바르지 않은 패스워드입니다.')
else:
print(f'{user.id} 존재하지 않는 ID 입니다')
---------------------------------------------------
💡main
manage = ManagerUser()
while True:
try:
n = int(input('1. 회원가입 2. 한줄일기쓰기 3. 한줄일기보기 4. 종료 : '))
if n not in [1, 2, 3, 4]:
print('다시 입력하세요')
continue
if n == 4:
print('\t 종료합니다 \t')
break
except Exception as e:
print(e)
continue
id = input('input ID : ')
pw = input('input PW : ')
user = User(id, pw)
if n == 1:
manage.join(user)
if n == 2:
manage.writeDiary(user)
if n == 3:
manage.viewDiary(user)
📋 수입과 지출을 기록하는 가계부
import time
path = "C:/Users/YUN/Python/"
💡클래스 AccountBook
class AccountBook:
def __init__(self):
self.deposit = 0
self.type = ''
self.balance = 0
def doDeposit(self):
money = int(input('입금액 입력 : '))
self.type = input('입금 내역 입력 : ')
print('입금완료!!!!')
print(f'기존 잔액 : {self.balance}')
self.balance += money
print(f'입금 후 잔액 : {self.balance}')
self.writeRecipt(0, money)
def doWithdraw(self):
money = int(input('출금액 입력 : '))
self.type = input('출금 내역 입력 : ')
if money < self.balance:
print('출금완료!!!!')
print(f'기존 잔액 : {self.balance}')
self.balance -= money
print(f'입금 후 잔액 : {self.balance}')
self.writeRecipt(1, money)
else:
print('잔액이 부족합니다.')
def writeRecipt(self, n, money):
lt = time.localtime()
strf_time = time.strftime('%Y-%m-%d %I:%M:%S')
if n == 0:
recipt = f'{"-" * 30}\n{strf_time}\n[입금] {self.type} : {money}원\n[잔액] ' \
f'{self.balance}원\n{"-" * 30}\n'
with open(path + 'accountBook.txt', 'a') as f:
f.write(recipt)
if n == 1:
recipt = f'{"-" * 30}\n{strf_time}\n[출금] {self.type} : {money}원\n[잔액] ' \
f'{self.balance}원\n{"-" * 30}\n'
with open(path + 'accountBook.txt', 'a') as f:
f.write(recipt)
---------------------------------------------------
💡main
account = AccountBook()
while True:
n = int(input('1. 입금 2. 출금 3. 종료 : '))
if n == 1:
account.doDeposit()
elif n == 2:
account.doWithdraw()
elif n == 3:
break
else:
print('다시 입력')
📋 사용자가 입력한 숫자의 약수를 텍스트 파일에 기록
def divisor(num):
divisors = []
for i in range(1, num + 1):
if num % i == 0:
divisors.append(i)
return divisors
---------------------------------------------------
💡main
path = "C:/Users/YUN/Python/"
n = int(input('0보다 큰 정수 입력 : '))
if n > 0:
with open(path + 'divisor.txt', 'a') as f:
f.write(f'{n}의 약수 : {divisor(n)}\n')
print('divisor write complete')
else:
print('0보가 큰 수를 입력하세요')
with open(path + 'divisor.txt', 'r') as f:
line = f.readline()
while line != '':
print(f'{line}')
line = f.readline()
📋 사용자가 입력한 숫자의 소수를 텍스트 파일에 기록
def isPrime(num):
primes = []
for i in range(2, num):
isFlag = True
for j in range(2, i):
if i % j == 0:
isFlag = False
break
if isFlag:
primes.append(i)
return primes
---------------------------------------------------
💡main
path = "C:/Users/YUN/Python/"
n = int(input('0보다 큰 정수 입력 : '))
if n > 0:
with open(path + 'primes.txt', 'a') as f:
f.write(f'{n}까지의 소수 : {isPrime(n)}\n')
print('prime write complete')
else:
print('0보가 큰 수를 입력하세요')
with open(path + 'primes.txt', 'r') as f:
line = f.readline()
while line != '':
print(f'{line}')
line = f.readline()
📋 두 개의 수를 입력하면 공약수를 텍스트 파일에 작성
path = "C:/Users/YUN/Python/"
def commonDivisor(n1, n2):
divisors = []
for i in range(1, n2):
if n1 % i == 0 and n2 % i == 0:
divisors.append(i)
return divisors
def maxCommonDivisor(n1, n2):
max = 0
for i in range(1, n2):
if n1 % i == 0 and n2 % i == 0:
if max < i:
max = i
return max
---------------------------------------------------
💡main
n1 = int(input('1보다 큰 정수 입력 : '))
n2 = int(input('1보다 큰 정수 입력 : '))
if n1 > 1 and n2 > 1:
with open(path + 'common_divisor.txt', 'a') as f:
f.write(f'{n1}와 {n2}의 최대공약수 : {maxCommonDivisor(n1, n2)}\n')
print('common factor write complete')
else:
print('1보다 큰 수를 입력하세요')
with open(path + 'common_divisor.txt', 'r') as f:
line = f.readline()
while line != '':
print(f'{line}')
line = f.readline()
📋 모든 배가 입항하는 날짜 구하기
from datetime import datetime, timedelta
def getCommonDateTerm(d1=3, d2=4, d3=5):
minMultiple = 0
for i in range(1, (d1 * d2 * d3) + 1):
if i % d1 == 0 and i % d2 == 0 and i % d3 == 0:
minMultiple = i
return minMultiple
---------------------------------------------------
💡main
path = "C:/Users/YUN/Python/"
baseTime = datetime(2023, 1, 1, 10, 0, 0)
while True:
with open(path + 'common_date.txt', 'a') as f:
if baseTime.month == 1 and baseTime.day == 1:
f.write(f'{baseTime.year}년 모든 선박 입항일\n')
f.write(str(baseTime) + '\n')
baseTime += timedelta(days=getCommonDateTerm())
if baseTime.year == 2024:
break
with open(path + 'common_date.txt', 'r') as f:
line = f.readline()
while line != '':
print(f'{line}')
line = f.readline()
📌소감
드디어 파이썬 중급 연습문제 풀이도 완료
후기_궁금증
파이썬의 리스트, 튜플, 딕셔너리의 차이 - 어떤 상황에서 각 개념들을 활용하는지 궁금증이 생겨 찾아봤다. 📑튜플, 리스트, 딕셔너리 비교에 잘 정리되어 있다.
클래스를 사용하지 않고 메소드만 이용하여 작성할때의 문제점 - 현재 연습문제 정도의 코드에서 큰 문제가 없지만 데이터 관리가 필요한 대규모 프로젝트 시 데이터 중복 문제와 휴먼 에러 발생 클래스와 메소드