본문 바로가기
SeSAC/파이썬 프로그래밍

[SeSAC 성동캠퍼스 1기] 파이썬 프로그래밍 4일차

by zivvon 2023. 11. 5.
목차 접기

Ch9. 파일 읽기와 쓰기

[ 파일은 왜 필요한가 ?]

: 파일에 출력하면 계속 반복해서 내용 확인 가능

 

[ 파일 읽기 ]

1. 파일 열기 : 파일을 열기 위해서는 open() 함수에서 파일명 지정하고, 읽기(Read)를 의미하는 'r'로 설정
- 모드(mode) : open() 함수의 마지막 매개변수
~> 파일을 열 때 어떤 용도로 열지 결정함
~> 파일 읽기용은 'r'을 씀
변수명 = open("파일경로/파일이름", "r")


2. 파일 읽기 : 파일에서 데이터를 읽어올 수 있는 상태

3. 파일 닫기 : 파일과 관련된 모든 작업이 끝나면 파일을 정상적으로 닫아줘야 함
- 파일을 닫기 위해 사용하는 변수는 open() 함수로 열었던 변수명
변수명.close()

 

 

[ 파일에 담아둔 데이터를 읽기 위한 함수 ]

: readline(), readlines()

 

- readline() 함수 : 파일의 내용을 한 행씩 읽어옴, 만약 파일에 100개의 행이 있다면 100번 반복해서 읽어야 함

 

ex) readline() 함수 예제

inFile = None # 입력 파일 
inStr = "" # 읽어온 문자열

inFile = open("C:/FirstPython/myData1.txt", "r", encoding="UTF-8")

inStr = inFile.readline() # 한 줄씩 읽어옴
print(inStr, end='')

inStr = inFile.readline() # 한 줄씩 읽어옴
print(inStr, end='')

inStr = inFile.readline() # 한 줄씩 읽어옴
print(inStr, end='')

inFile.close() # 파일 닫아줘야함!
inFile = None # 입력 파일 
inStr = "" # 읽어온 문자열

inFile = open("C:/FirstPython/myData1.txt", "r", encoding="UTF-8")

while True:
    inStr = inFile.readline()
  
    if inStr == "":
        break
    print(inStr, end='')

inFile.close() # 파일 닫아줘야함!

 

- readlines() 함수 : 파일의 내용을 한꺼번에 읽어 리스트에 저장

 

ex) readlines() 함수 예제

inFile = None # 입력 파일 
inList = "" # 읽어온 문자열 저장 리스트

inFile = open("C:/FirstPython/myData1.txt", "r", encoding="UTF-8")

inList = inFile.readlines() # 한꺼번에 읽어옴
print(inList)

inFile.close() # 파일 닫아줘야함!

 

[ 파일 쓰기 ]

1. 파일 열기 : open() 함수에서 파일명 지정하고, 파일 쓰기 모드 지정
- 이 때, 파일 경로에 같은 이름의 파일이 있다면 기존 파일 덮어씀 (같은 이름의 파일이 없다면 파일 새로 생성함)
- 쓰기용은 open() 함수의 매개변수로 'w' 사용
변수명 = open("파일경로/파일이름", "r")​

2. 파일 쓰기 : 결과를 파일에 쓰게 되면 모니터에는 나오지 않고, 파일로 직접 저장됨
- writelines() : 파일에 결과를 씀

ex) writelines() 예

outFile = None # 입력 파일 
outStr = "" # 읽어온 문자열 저장 리스트

outFile = open("C:/FirstPython/myData1.txt", "r", encoding="UTF-8")

while True:
    outStr = input("내용 입력 : ")
    if outStr != "":
        outFile.writelines(outStr + "\n")
    else:
        break

outFile.close() # 파일 닫아줘야함!
print("--- myData1.txt 파일이 저장됨 ---")​


3. 파일 닫기
변수명.close()

 

ex) 친구의 필기 노트 파일 복사하기

친구의 파이썬 수업의 필기 노트 파일을 복사하려고 합니다. 파일을 띄워놓고 한 줄씩 따라 쓰기에는 시간이 부족하니 친구의 필기 노트 파일과 동일한 파일을 복사해서 만드는 프로그램을 작성해봅시다. 윈도우의 파일 탐색기에서 파일 선택한 후, Ctrl C, V하는 효과와 동일합니다. 
# 친구의 필기 노트 파일 복사
inFile, outFile = None, None
inStr = ""

inFile = open("C:/FirstPython/pythonNote.txt", "r", encoding="UTF-8") #읽기
outFile = open("C:/FirstPython/myNote.txt", "w", encoding="UTF-8") #쓰기

inList = inFile.readlines()

for inStr in inList:
    outFile.writelines(inStr)

inFile.close()
outFile.close()

print("---pythonNote.txt가 myNote.txt로 복사되었음---")

 

ex) 스파이에게 보낼 문자 암호화하기

중요한 내용의 보안이 필요한 파일을 메일로 전달할 때, 그냥 전달하면 누출의 위험이 있습니다. 그래서 입력한 내용을 파일로 암호화해서 저장하는 방법을 살펴봅시다.
- 글자 암호화 하는 방법
~> ord(문자) : 문자의 고유 숫자를 알려줌
~> chr(숫자) : 고유 숫자에 해당하는 문자를 알려줌
print(ord('S')) ## output '83'
print(chr(83)) ## output 'S'

 

~> 암호화 : 'S'의 고유 숫자인 83에 적당한 값 더하기
~> 해독하기  : 암호화된 글자의 고유 숫자에서 암호화 할 때 더한 값 빼기
# 스파이에게 보낼 문자 암호화하기
def getMsg():
  msg = input("스파이에게 전달할 메시지 : ")
  return msg


def secureMsg(msg):
  secureFile = None
  secure = ""

  secureFile = open("c:/FirstPython/secure.txt", "w", encoding="UTF-8")

  for i in msg:
    num = ord(i)
    num += 1
    secure += chr(num)  # 암호화

  secureFile.writelines(secure)
  secureFile.close()


while True:
  msg = getMsg()

  if msg == "":
    msg += msg
    print("--- secure.txt 암호화 완료 ---")
    break
  else:
    print(msg)
    secureMsg(msg)

 

ex) 파일 속 단어 대체해서 다시 쓰기 😱

ㄴ 다양하게 시도 중... 정답코드 꼭 올려놓을거다 


 

Ch10. 객체 지향 프로그래밍

[ 객체 ]

: 수많은 사물을 프로그래밍 관점에서 객체(Object)라고 부름 ex) 자동차, 건물, 고양이, 물고기 등

객체란 어떤 속성과 행동을 가지고 있는 데이터를 말한다.

 

[ 클래스 ]

: 파이썬에서 제공하는 객체 외에 필요한 객체를 만들어서 사용할 수 있는데, 객체를 만들기 위해서는 클래스가 필요함

클래스란 객체를 만들기 위한 설계도 또는 찍어내는 틀을 의미한다.

 

ex) 파이썬이 제공하지 않는 토끼 클래스 만들기

토끼 객체를 만드려면 먼저 토끼 클래스가 필요
클래스를 만들기 위한 형식 ⭐
class 클래스이름:
	# 클래스 생성 코드 구현​
# 토끼 클래스
class Rabit:
  # 토끼의 속성(변수)
  모양 = ""
  x위치 = 0
  y위치 = 0
    
# 토끼의 행동(메소드)
def goto(이동할 좌표):
  # 토끼를 이동할 좌표로 이동시키는 코드
# 파이썬 코드로 구현
class Rabit:
  shape = ""
  xPos = 0
  yPos = 9
    
def goto(self, x, y):
  self.xPos = x
  self.yPos = y

 

[ 객체의 생성 ]

ex) 토끼 객체 생성
- 토끼 설계도(클래스)로, 실제 토끼(객체)를 제작하는 작업이 필요
rabbit1 = Rabbit()
rabbit2 = Rabbit()
rabbit3 = Rabbit()​

- 속성에 값 대입하기
~> 각각의 토끼는 서로 별도의 토끼이기 때문에, 컴퓨터 안에서 서로 다른 메모리 공간을 차지
~> 각 객체에는 별도의 속성이 존재하고, 각각에 별도의 값을 대입할 수 있음
~> 각각의 토끼는 '객체이름.속성이름'으로 접근 가능

- 메소드의 호출
~> 메소드도 각 객체마다 별도로 존재
~> 메소드의 호출은 '객체이름.메소드이름()' 형식을 사용
rabbit1.shpae = "원"
rabbit2.shpae = "삼각형"
rabbit3.shpae = "토끼"

 

ex) 토끼가 이동한 좌표 구하기

# 깡총깡총 뛰어다니는 토끼
class Rabbit:
  x = 0
  y = 0

  # get
  def move(self):
      return self.x, self.y

  # set
  def move(self, dx, dy):
      self.x += dx
      self.y += dy

_x = 0
_y = 0

myRabbit = Rabbit()

while True:
  _x = input("토끼가 이동할 X좌표 ==> ")
  _y = input("토끼가 이동할 Y좌표 ==> ")

  if (_x == 'q') or (_y == 'q'):
    print("** 종료 **")
    break
  elif not (_x.isdigit() or _y.isdigit()):
    print("** 숫자만 입력해주세요 **")
    break
  else:
    _x = int(_x)
    _y = int(_y)

    myRabbit.move(_x, _y)
    print("현재 토끼의 위치는", myRabbit.x, myRabbit.y)

 

토끼의 위치가 누적되지 않아서 뭐지?!했는데 while문 안에서 자꾸 바인딩 해서 그랬던 거였다.

하하.. 바본가? 벅벅....

무튼! c++이랑 class 부분이 너무 달라서 따로 공부 좀 해야겠다!


오늘의 후기!

도 역시나 열심히 해야겠다라는 다짐뿐