Python challenge
[111~117] csv 파일 읽기와 쓰기
Grace Ryu
2023. 9. 24. 10:48
#111. csv파일 읽기와 쓰기
import csv
file = open("Books.csv", 'w')
title = "to kill a mockingbird, harper lee, 1960\n"
file.write(str(title))
title = "a brief history of time, stephen hawking, 1988\n"
file.write(str(title))
title = "the great gatsby, f.scott fitzgerald, 1922\n"
file.write(str(title))
title = "the man who mistook his wife for a hat, oliver sacks, 1985\n"
file.write(str(title))
title = "pride and prejudice, jane austen, 1813\n"
file.write(str(title))
file.close()
#112. 111번 프로그램에서 만든 파일 이용
#사용자에게 다른 레코드를 입력하도록 요청하고, 입력된 데이터를파일의 끝에 추가
#csv파일 각 행을 한줄에 하나씩 출력
import csv
file = open("Books.csv", 'a')
title_name = input("타이틀: ")
writer = input("저자: ")
publish_year = input("출간연도: ")
title = f"{title_name}, {writer}, {publish_year} \n"
file.write(str(title))
file.close()
file = open("Books.csv", 'r') #파일 출력
for i in file:
print(i)
file.close()
#113. books.csv파일을 사용하며, 리스트에 몇개의 레코드를 추가하고 싶은지 묻고 입력값만큼 추가할수 있도록 한다.
#모든 데이터가 추가된 후에 사용자에게 검색할 저자의 이름을 입력하라고 요청
#입력한 저자의 모든 책 정보 출력
#만약 입력한 저자의 책이 하나도 없다면, 그게 맞는 메세지를 출력
#오류가 났는데 미해결상태임
import csv
num = int(input("몇개 레코드 출력하고 싶어?: "))
file = open("Books.csv", 'a')
for i in range(0, num):
title_name = input("타이틀: ")
writer = input("저자: ")
publish_year = input("출간연도: ")
title = f"{title_name}, {writer}, {publish_year} \n"
file.write(str(title))
file.close()
#책 찾기
ask_writer = input("저자의 이름 검색: ")
found_books = []
file = open("Books.csv", 'r')
for row in file:
title_name, writer, publish_year = row #ValueError: too many values to unpack (expected 3)오류. 해결못함
if ask_writer == writer:
found_books.append(row)
file.close()
if found_books:
print(f"{ask_writer}의 책 목록:")
for book in found_books:
print(f"title: {book[0]}, writer: {book[1]}, year: {book[2]}")
else:
print(f"{ask_writer}의 책 없음.")
file = open("Books.csv", "a", newline='')
ans = int(input("레코드 몇 개를 추가하시겠습니까? "))
for i in range(ans):
title = input("제목을 입력하세요: ")
author = input("저자를 입력하세요: ")
year = input("출간연도를 입력하세요: ")
newrecord = title + "," + author + "," + year + "\n"
file.write(str(newrecord))
file.close()
file = open("Books.csv", "r")
search = input("검색할 저자의 이름을 입력하세요: ")
for row in file:
if search in str(row):
print(row)
#114.books.csv파일을 사용해 사용자에게 시작년도와 끝년도를 입력하라고 요청
#입력된 두 년도 사이에 출간된 모든 책 출력
import csv
first_year = input("시작년도: ")
last_year = input("끝년도: ")
file = open(found_books)
#115. books.csv파일을 사용하여 각 행 번호와 그에 대한 데이터출력
import csv
file = open("Books.csv", 'r')
a = 0
for row in file:
data = str(a) + ":" + row
print(data)
a += 1
#116. Books.csv파일의 데이터를 리스트로 가져온다.
# 사용자에게 리스트를 표시하고, 어떤 행을 삭제하고 싶은지 선택하라고 요청
# 선택한 행을 삭제
# 수정하고 싶은 데이터 선택 요청, 선택한 행 수정
# 데이터 원래 csv 파일 다시써서 기존 데이터 수정된 데이터로 덮어씀
#하다가 안되서 챗GPT도움을 받음.수정데이터로 덮어써지는건 안됨.
import csv
csv_file_name = "Books.csv"
book_data = [] #북리스트
with open(csv_file_name, 'r') as file:
reader = csv.reader(file)
for row in reader:
book_data.append(row)
#print(book_data)
print("book_data:") #북리스트 출력
for index, book in enumerate(book_data): #enumerate:인덱스와 값을 동시에 얻고싶을때
print(f"{index + 1} : {book[0]}, {book[1]}, {book[2]}")
del_num = input("삭제하고 싶은 행: ") #선택행 삭제
if del_num.isdigit(): #.isdigit()는 사용자가 입력한 문자열이 숫자로만 이루어져 있는지 확인하는 메소드. 문자열이 숫자로만 이루어져 있으면 True
del_num = int(del_num)
if 1 <= del_num <= len(book_data):
selected_book = book_data[del_num - 1]
print(f"선택 책:{selected_book[0]}, {selected_book[1]}, {selected_book[2]}")
action = input("삭제하려면 'D', 수정하려면 'M'을 입력하세요: ").upper()
if action == 'D': # 선택한 행 삭제
deleted_book = book_data.pop(del_num - 1)
print(f"책 삭제: {deleted_book[0]},{deleted_book[1]}, {deleted_book[2]}")
elif action == 'M': # 선택한 행 수정
new_title = input("새로운 타이틀: ")
new_writer = input("새로운 저자: ")
new_year = input("새로운 출간연도: ")
book_data[del_num - 1] = [new_title, new_writer, new_year]
print("책 수정")
else:
print("오류")
else:
print("오류")
else:
print("숫자 입력")
#117. 사용자의 이름을 묻고, 두개의 임의의 질문을 생성하는 간단한 수학 퀴즈를 만든다.
#사용자의 이름과 질문, 답변, 그리고 최종 점수를 csv파일로 저장한다.
#프로그램이 실행될때마다 csv 파일에 추가되며 덮어쓰지 않는다.
#간단한 수학퀴즈 프로그램이 이해가 되지 않았음 #챗gpt도움 ->결과가 잘 안나옴
import csv
import random
name = []
for i in range(2):
new = input("이름: ")
name.append(new)
#퀴즈만들기 (답지)
results = []
for i in range(1, 3):
quiz = {
"question": f"{random.randint(1, 10)} {'+' if i == 1 else '*'} {random.randint(1, 10)} = ?",
"answer": str(random.randint(2, 20 if i == 1 else 100))
}
print(f"=== 퀴즈 {i} ===")
print(quiz["question"])
user_answer = input("정답을 입력하세요: ")
score = 1 if user_answer == quiz["answer"] else 0
results.append((f"퀴즈 {i}", quiz["question"], user_answer, score))
total_score = sum(result[3] for result in results)
#결과 저장
with open("quit.csv", 'a') as file:
writer = csv.writer(file)
if file.tell() == 0:
writer.writerow(["Name", "Quiz", "Question", "User Answer", "Score"])
for result in results:
writer.writerow([new, result[0], result[1], result[2], result[3]])
print(f"{new}님의 점수: {total_score} / 2")
보충
1) .isdigit() 메서드
주로 사용자로부터 입력된 문자열이 숫자로만 이루어져 있는지를 검증하거나,
숫자로만 이루어진 문자열을 정수로 변환하기 전에 검증할 때 사용
문자열에 속한 모든 문자가 숫자로만 이루어져 있으면 True를 반환
문자열에 숫자 이외의 문자가 포함되어 있거나, 비어있는 경우에는 False를 반환
2) tell() 메서드
파일 객체의 현재 위치(바이트 단위)를 알려주는 메서드
#주로 이진 파일 또는 텍스트 파일을 다룰 때 파일의 현재 위치를 추적하는 데 사용
#.isdigit() 메서드
"12345".isdigit() # True를 반환
"Hello123".isdigit() # False를 반환 (숫자 이외의 문자가 포함됨)
"".isdigit() # False를 반환 (비어 있음)
#tell() 메서드
file = open("example.txt", "r")
data1 = file.read(5) # 처음 5바이트 읽기
print("현재 위치:", file.tell()) # 현재 위치 표시 #5
data2 = file.read(10) # 다음 10바이트 읽기
print("현재 위치:", file.tell()) # 현재 위치 표시 #15