TIL | 파이썬 기초 #10

vel.Ash·2022년 3월 25일
0
post-thumbnail

파일 읽고 쓰기

파일 읽기

<파일 읽는 법>

-먼저 같은 폴더 내 파일 넣기

with open('파일명.파일형식', 'r') as f:  # 파일을 f라는 변수에 저장 
with open('폴더명/파일명.파일형식', 'r') as f:  # 다른 폴더에 있는 것 읽는 경우 

# 예시
with open('chicken.txt', 'r') as f:
with open('data/chicken.txt', 'r') as f:  # 경로기재
	print(type(f))
	for line in f:
		print(line)
<class '_io.TextIOWrapper'>   #  리스트는 아니지만 for문 쓰면 리스트와 비슷하게 사용가능
1: 575000   # f에 저장된 값이 리스트와 비슷하게 순차적으로 출력됨 
               # 텍스트 파일 내 엔터가 있기때문에 \n이 되어 빈줄 생성됨
2: 548000

3: 485300

.
.
.

strip

: 텍스트 파일 화이트 스페이스→(“ ”, “\t”, “\n” 등) 없애는 방법

<예시>

print("              abc   def         ".strip())
print("      \t  \n        abc   def   \n\n\n      ".strip())
abc   def   # 중간 스페이스는 안사라지고 남아있다. 
abc   def

<외부 파일에서 화이트 스페이스 없애는 방법>

with open('파일명.파일형식', 'r') as f:  # 파일을 f라는 변수에 저장 
with open('폴더명/파일명.파일형식', 'r') as f:  # 다른 폴더에 있는 것 읽는경우 

# 예시
with open('chicken.txt', 'r') as f:
with open('data/chicken.txt', 'r') as f:  # 경로기재
	print(type(f))
	for line in f:
		print(line.strip())
1: 575000   
2: 548000
3: 485300

split

: 지정한 파라미터를 기준으로 문자열을 나누는 것

# 예시 1
my_string = "1. 2. 3. 4. 5. 6"
print(my_string.split(".")   # .을 기준으로 문자열 나누기 
print(my_string.split(". ")

# 예시 2 (인덱싱) 
full_name = "Kim, Yuna"
name_data = full_name.split(", ")
last_name = name_data[0]
first_name = name_data[1]

print(first_name, last_name)

# 예시 3 split으로 화이트 스페이스 모두 지우고 싶은 경우 
print("     \n\n   2   \t  \n 5  7 \n".split())
# split에 아무것도 지정 안해주면 됩니다
['1', ' 2', ' 3', ' 4', ' 5', ' 6']  # 숫자 앞에 공백 있음 
['1', '2', '3', '4', '5', '6']  

Yuna Kim 

['2', '3', '5', '7']

매출 평균 구하기

with open('data/chicken.txt', 'r') as f:
    total_revenue = 0
    total_days = 0

    for line in f:
        data = line.strip().split(": ")
        revenue = int(data[1])  # 그날의 매출

        total_revenue += revenue
        total_days += 1

    print(total_revenue / total_days)
501916.12903225806

파일 쓰기

with open('new_file.txt', 'w') as f:  # w는 여러번 실행시 덮어씌워짐
	f.write("Hello world!")
	f.write("My name is ash.")

	f.write("Hello world!"\n)
	f.write("My name is ash."\n)
# 파일 내 
Hello world!My name is ash.
Hello world!
My name is ash.

<기존 파일에 추가하고 싶은 경우>

with open('new_file.txt', 'a') as f:  # a는 영어단어 append(추가)
	f.write("Hello world!")
	f.write("My name is ash.")
Hello world!
My name is ash. 
Hello world!
My name is ash.  # 빈 파일에서 두번 실행한 경우 

*파일이 없어도 w대신 a 사용가능. 맨 처음에는 파일 만들어줌 r


단어장 만들기

with open('vocabulary.txt', 'w') as f:
    while True:
        english_word = input('영어 단어를 입력하세요: ')    
        if english_word == 'q':
            break
        
        korean_word = input('한국어 뜻을 입력하세요: ')
        if korean_word == 'q':
            break
        
        f.write('{}: {}\n'.format(english_word, korean_word))

while True → break 나올 때까지 무한반복!
type 잘 생각하고 적기, 단순하게 어떤 조건 필요한지 계속 생각해보기(어떤 기능 활용해야 할지 연결), 코드 순서 중요하게 생각!


단어 퀴즈

<생각>

1.  -> 단어만 순서대로 출력되도록 하기 for문 사용
2. 단어 : input으로 입력 하게 만들기 
3. 정답일 경우 -> 출력"맞았습니다"
4. 오답 -> 출력"아쉽습니다. 정답은 {}입니다. 
 정답만 확인되도록 추가 

-어려운 점 : 어디다가 위치 넣어야할 지 어렵 .. 순서랑 for문 안, 밖? 등 
 + for 이랑 인덱스 함께 쓰는 거 개념 다시 정리 헷갈려서 복습

<답안>

with open('vocabulary.txt', 'r') as f:
    for line in f:
        data = line.strip().split(': ')
        kor_word = data[0]
        eng_word = data[1]

        answer = input("{}:".format(kor_word))

        if answer == eng_word:
            print("맞았습니다!")
        else:
            print("아쉽습니다. 정답은 {}입니다.".format(eng_word))

고급 단어장

<생각>

Q.random 모듈, dictionary 이용해서 단어들 랜덤한 순서로 내도록 업그레이드하기.
(같은 단어 여러번 물어봐도 괜찮고 q를 입력할 때까지 계속실행_ 
1.단어 모음 -> dictionary로 만들기 
  사전 생성후 data 저장하기 
2.random사용해서 단어 랜덤하게 나오도록 만들기(random은 숫자로 알고있는데 일단 찾기)
 *random **리스트** 데이터를 활용하는 모듈의 몇가지 함수 
  -choice(): 리스트의 요소 중 랜덤해서 리턴
  -shuffle(): 리스트의 요소 순서를 무작위로 섞음
  -sample(): 리스트의 함수 중 n개를 랜덤으로 추출하여 새로운 리스트로 변환. 원본은 유지

? 근데 그러면 왜 다시 사전에서 리스트로 바꾸는 건진 모르겠다  
-->문자 자체를 랜덤으로 뽑는 것으로 써봣는데 계속 답이 바뀌고 안됨 
--> 숫자로 인덱싱해서 나머지 답연결해서 쓰는 방법으로 변경 

<모범 답안>

import random

# 사전 만들기
vocab = {}
with open('vocabulary.txt', 'r') as f:
    for line in f:
        data = line.strip().split(": ")
        english_word, korean_word = data[0], data[1]
        vocab[english_word] = korean_word

# 목록 가져오기
keys = list(vocab.keys())

# 문제 내기
while True:
    # 랜덤한 문제 받아오기
    index = random.randint(0, len(keys) - 1)
    english_word = keys[index]
    korean_word = vocab[english_word]
    
    # 유저 입력값 받기
    guess = input("{}: ".format(korean_word))
    
    # 프로그램 끝내기
    if guess == 'q':
        break
    
    # 정답 확인하기
    if guess == english_word:
        print("정답입니다!\n")
    else:
        print("아쉽습니다. 정답은 {}입니다.\n".format(english_word))
profile
코린이의 개발공부

0개의 댓글