πŸ“š μŠ€ν„°λ””/파이썬 μŠ€ν„°λ”” κ°•μ˜μžλ£Œ

[3νŒ€/김경은] 10μ£Όμ°¨ 파이썬 μŠ€ν„°λ”” - μ˜ˆμ™Έμ²˜λ¦¬

경은 2023. 6. 2. 08:48

데이터 과학을 μœ„ν•œ 파이썬 ν”„λ‘œκ·Έλž˜λ° κ΅μž¬λ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•œ κ°•μ˜μžλ£Œμž…λ‹ˆλ‹€.

10μ°¨μ‹œ_μ˜ˆμ™Έμ²˜λ¦¬_κ°•μ˜μ•ˆ.pdf
0.69MB
10μ°¨μ‹œ_μ˜ˆμ™Έμ²˜λ¦¬_과제.pdf
1.42MB

 

μ˜ˆμ™Έμ˜ κ°œλ…κ³Ό 사둀

  • μ‹€μ œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ° μœ„ν•΄ μ•Œμ•„μ•Ό ν•˜λŠ” μ˜ˆμ™Έ 처리
  • μ˜ˆμ™Έ (exception)λž€ ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λ©΄μ„œ μ˜ˆμƒν•˜μ§€ λͺ»ν•œ 상황이 λ°œμƒν•˜λŠ” 것이닀.
  • λŒ€ν‘œμ μΈ μ‚¬λ‘€λ‘œ μ‚¬μš©μžμ˜ μž…λ ₯ 였λ₯˜κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μƒˆλ‘œμš΄ μ›Ή μ‚¬μ΄νŠΈμ— κ°€μž…ν•˜μ—¬ 아이디λ₯Ό μƒμ„±ν•˜λ €κ³  ν•œλ‹€. 일반적으둜 μ•„μ΄λ””λŠ” μ˜λ¬Έμžλ‚˜ 숫자λ₯Ό μ§€μ›ν•˜λŠ”λ°, λ•Œλ‘œλŠ” μ‚¬μš©μžκ°€ ν•œκΈ€λ‘œ 아이디λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ ν•œκΈ€ μž…λ ₯을 μ‹œλ„ν•  λ•Œκ°€ μžˆλ‹€. 이 경우 μž…λ ₯된 ν•œκΈ€μ΄ μ•„λ¬΄λŸ° 문제 없이 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯되면 자칫 μ‚¬μš©μžκ°€ ν•΄λ‹Ή μ›Ή μ‚¬μ΄νŠΈμ— λ‘œκ·ΈμΈν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆλ‹€. ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ‹€μˆ˜λ‘œ 인코딩에 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ— ν•œκΈ€μ΄ 잘λͺ» μ €μž₯될 수 도 있기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ μ‚¬μš©μžκ°€ μ΄λŸ¬ν•œ μ‹€μˆ˜λ₯Ό ν•˜μ§€ μ•Šλ„λ‘ λ§‰λŠ” 것이 μ€‘μš”ν•˜λ‹€.
  • 또 λ‹€λ₯Έ μ‚¬λ‘€λ‘œ MS μ˜€ν”ΌμŠ€μ—μ„œ μ§€μ›ν•˜λŠ” μžλ™ μ €μž₯(autosave) κΈ°λŠ₯이 μžˆλ‹€. 이 κΈ°λŠ₯은 MS μ˜€ν”ΌμŠ€ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μž‘μ—…ν•˜λ˜ 쀑 μ •μ „ λ“±μ˜ 이유둜 κ°‘μžκΈ° 컴퓨터가 μ’…λ£Œλ˜μ—ˆμ„ λ•Œλ₯Ό λŒ€λΉ„ν•˜μ—¬ μž‘μ—…ν•œ 것을 쀑간에 μžλ™μœΌλ‘œ μ €μž₯ν•΄μ£ΌλŠ” κΈ°λŠ₯이닀. μžλ™ μ €μž₯ κΈ°λŠ₯은 κ²Œμž„μ΄λ‚˜ 은행 거래 λ“± μ—μ„œ 맀우 μ€‘μš”ν•œ 역할을 ν•˜κ³  μžˆλ‹€.
  • μ΄λŸ¬ν•œ μ‚¬λ‘€μ²˜λŸΌ ν”„λ‘œκ·Έλž¨μ„ μ‹€μ œλ‘œ μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•˜λ‹€ 보면 μ˜ˆμƒν•˜μ§€ λͺ»ν•œ 일이 많이 λ°œμƒ ν•˜λŠ”λ°, 이λ₯Ό μ˜ˆμ™ΈλΌκ³  ν•œλ‹€.

 

예츑 κ°€λŠ₯ν•œ μ˜ˆμ™Έμ™€ 예츑 λΆˆκ°€λŠ₯ν•œ μ˜ˆμ™Έ

예츑 κ°€λŠ₯ν•œ μ˜ˆμ™Έ

  • 예츑 κ°€λŠ₯ν•œ μ˜ˆμ™ΈλŠ” λ°œμƒ μ—¬λΆ€λ₯Ό κ°œλ°œμžκ°€ 사전에 인지할 수 μžˆλŠ” μ˜ˆμ™Έμ΄λ‹€.
  • 예λ₯Ό λ“€μ–΄ ‘ν…μŠ€νŠΈ λ°•μŠ€μ— μ‚¬μš©μžκ°€ μ‹€μˆ˜λ‘œ 잘λͺ»λœ 값을 μž…λ ₯ν•  것 κ°™λ‹€.’라든가 ‘μ‚¬μš©μžκ°€ μ‹€μ œλ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ— μ €μž₯ν•  것 κ°™λ‹€.’ 등은 κ°œλ°œμžκ°€ 사전에 μ˜ˆμΈ‘ν•  수 μžˆλŠ” κ²ƒμœΌλ‘œ μ–Όλ§ˆλ“ μ§€ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.
  • 즉, κ°œλ°œμžλŠ” μ˜ˆμ™Έλ₯Ό μ˜ˆμΈ‘ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έκ°€ λ°œμƒν•  λ•ŒλŠ” μ–΄λ–»κ²Œ λŒ€μ‘ν•˜λΌκ³  λŒ€μ±…μ„ λ§ˆλ ¨ν•΄ 놓을 수 μžˆλ‹€.
  • λŒ€ν‘œμ μœΌλ‘œ μ‚¬μš©μž μž…λ ₯λž€μ— 값이 잘λͺ» μž…λ ₯λ˜μ—ˆλ‹€λ©΄ if문을 μ‚¬μš©ν•˜μ—¬ 잘λͺ» μž…λ ₯ν•˜μ˜€λ‹€κ³  μ‘λ‹΅ν•˜λŠ” 방법이 μžˆλ‹€. μ•„μ£Ό μ‰½κ²Œ λŒ€μ‘μ΄ κ°€λŠ₯ν•˜λ‹€.

예츑 λΆˆκ°€λŠ₯ν•œ μ˜ˆμ™Έ

  • λŒ€ν‘œμ μœΌλ‘œ 맀우 λ§Žμ€ νŒŒμΌμ„ μ²˜λ¦¬ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ 5,000개의 파일이 ν•œ 디렉터리에 있고 κ·Έ 파일λͺ…듀을 λ„˜κ²¨ λ°›μ•„ νŒŒμΌμ„ ν•˜λ‚˜μ”© μ½μ–΄λ“€μ΄λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“ λ‹€κ³  ν•˜μž. 그런데 νŒŒμΌμ„ 읽닀가 μ–΄λ–€ νŒŒμΌμ€ μ‹€μ œλ‘œ μ•ˆμ— λ‚΄μš©μ΄ 없을 수 μžˆλŠ”λ°, 이런 κ²½μš°μ—λ„ μ–΄λ–€ 처리λ₯Ό ν•˜μ§€ λͺ»ν•˜κ³  λ„˜μ–΄κ°„λ‹€. λ˜λŠ” νŒŒμΌμ„ 읽고 μžˆλŠ”λ° λ‹€λ₯Έ μ‚¬μš©μžμ— μ˜ν•΄ ν•΄λ‹Ή 파일이 μ‚­μ œλ˜μ–΄ μ½μ–΄λ“€μ΄λŠ” μ‹œμ μ— ν•΄λ‹Ή 파일이 μ‚¬λΌμ§€λŠ” κ²½μš°λ„ λ°œμƒν•  수 μžˆλ‹€. 이외에도 인덱슀의 λ²”μœ„λ₯Ό λ„˜μ–΄κ°€λŠ” 리슀트의 ν˜ΈμΆœμ΄λ‚˜ μ •μˆ˜λ₯Ό 0으둜 λ‚˜λˆ„λŠ” 것 등에 λŒ€ν•œ λ¬Έμ œκ°€ 생길 수 μžˆλ‹€.
  • μ΄λŸ¬ν•œ 예츑 λΆˆκ°€λŠ₯ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ 경우 인터프리터가 μžλ™μœΌλ‘œ 이것이 μ˜ˆμ™ΈλΌκ³  μ‚¬μš©μžμ—κ²Œ μ•Œλ €μ€€λ‹€. λŒ€λΆ€λΆ„μ€ μ΄λŸ¬ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄μ„œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ―€λ‘œ μ μ ˆν•œ 쑰치λ₯Ό ν•΄μ•Ό ν•œλ‹€. λ‹¨μˆœνžˆ 파일이 μ—†λ‹€κ³  μ•Œλ €μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ 파일이 μ—†κΈ° λ•Œλ¬Έμ— μΆ”κ°€λ‘œ ν•΄μ•Ό ν•˜λŠ” μ‘°μΉ˜κ°€ μžˆλ‹€λ©΄ 그것을 μ˜ˆμ™Έ 처리 ꡬ문에 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄, μ²˜λ¦¬ν•΄μ•Ό ν•  파일이 μ—†λ‹€ λ©΄ 파일이 μ—†λ‹€κ³  기둝을 남기고 λ‹€μŒ νŒŒμΌμ„ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
  • μ˜ˆμ™Έ μ²˜λ¦¬κ°€ μ€‘μš”ν•œ μ΄μœ λŠ” ν”„λ‘œκ·Έλž¨λ„ μΌμ’…μ˜ μ œν’ˆμ΄κΈ° λ•Œλ¬Έμ΄λ‹€. μš°λ¦¬κ°€ μ œν’ˆμ„ μ‚¬μš©ν•  λ•Œ μƒμ„Έν•œ μ„€λͺ…이 μ—†κ±°λ‚˜ μ‚¬μš©μž μΉœν™”μ μ΄μ§€ μ•Šμ€ 경우 맀우 ν™”κ°€ λ‚  수 μžˆλ‹€. TV 리λͺ¨μ»¨μ„ 쑰금 만 잘λͺ» λˆŒλŸ¬λ„ TVκ°€ 꺼진닀면 μ‚¬μš©μžλŠ” κ·Έ νšŒμ‚¬ μ œν’ˆμ„ λ”λŠ” μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것이닀. μ΄λŸ¬ν•œ 이유둜 μ˜ˆμ™Έ μ²˜λ¦¬λŠ” μ œν’ˆμ˜ 완성도λ₯Ό λ†’μ΄λŠ” μ°¨μ›μ—μ„œ 맀우 μ€‘μš”ν•œ κ°œλ…μ΄λ‹€.

μ˜ˆμ™Έ 처리 ꡬ문

  • μ˜ˆμ™Έ 처리 ꡬ문을 파이썬으둜 κ΅¬ν˜„ν•˜λŠ” 방법

try-except문

try:
    μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯ μ½”λ“œ 
except μ˜ˆμ™Έ νƒ€μž…:
    μ˜ˆμ™Έ λ°œμƒ μ‹œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
  • νŒŒμ΄μ¬μ—μ„œ μ˜ˆμ™Έ 처리의 κΈ°λ³Έ 문법은 try-except문이닀.
  • 사싀 λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” ꡬ문은 이와 λΉ„μŠ·ν•˜λ‹€. μž‘μ„±ν•˜λŠ” 방식은 try문에 μ˜ˆμ™Έ λ°œμƒμ΄ μ˜ˆμƒλ˜λŠ” μ½”λ“œλ₯Ό 적고, except문에 μ˜ˆμ™Έ λ°œμƒ μ‹œ λŒ€μ‘ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.
for i in range(10): 
    try:
        print(10 / i)
    except ZeroDivisionError:
        print("Not divided by 0")
Not divided by 0 
10.0
5.0
3.3333333333333335 
2.5
2.0 
1.6666666666666667 
1.4285714285714286 
1.25 
1.1111111111111112
  • μœ„μ˜ μ½”λ“œλŠ” 0λΆ€ν„° 9κΉŒμ§€μ˜ 숫자λ₯Ό i 에 ν•˜λ‚˜μ”© ν• λ‹Ή ν•˜λ©΄μ„œ 10 으둜 λ‚˜λˆˆ 값을 좜λ ₯ν•˜λŠ” μ½”λ“œμ΄λ‹€.
  • 이 ν”„λ‘œκ·Έλž¨μ€ 1이 μ•„λ‹Œ 0λΆ€ν„° μ‹œμž‘ν•˜λ‹€ λ³΄λ‹ˆ 10을 0으 둜 λ‚˜λˆ„λŠ” 계산이 κ°€μž₯ λ¨Όμ € μ‹€ν–‰λœλ‹€. μ²˜μŒμ— ‘10δΈ‰0(10/0)’을 κ³„μ‚°ν•˜λ©΄ 0μœΌλ‘œλŠ” 10을 λ‚˜λˆŒ 수 μ—†μœΌλ―€λ‘œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.
  • ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ μ˜ˆμ™Έμ˜ λ°œμƒμ€ μ˜ˆμƒ κ°€λŠ₯ν•˜λ―€λ‘œ try문으둜 ν•΄λ‹Ή μ˜ˆμ™Έμ˜ λ°œμƒμ„ λŒ€λΉ„ν•  수 μžˆλ‹€. ZeroDivisionError, 즉 0으둜 λ‚˜λˆ μ§€λŠ” κ²½μš°μ—λŠ” exceptλ¬Έ μ•ˆμœΌλ‘œ λ“€μ–΄κ°€ ν•΄λ‹Ή ꡬ문을 μ²˜λ¦¬ν•œλ‹€. μ—¬κΈ°μ„œλŠ” print("Not divided by 0") μ½”λ“œ κ°€ μ‹€ν–‰λœλ‹€.
  • 그런데 λ§Œμ•½ μ—¬κΈ°μ„œ try문이 forλ¬Έ 밖에 있으면 반볡문 전체가 μ’…λ£Œλœλ‹€. 즉, tryλ¬Έ λ‚΄λΆ€μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ exceptλ¬Έ μ˜μ—­μ— μžˆλŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κ³  try- except문이 μ’…λ£Œλœλ‹€. μ΄λ ‡κ²Œ try문을 μ λ‹Ήν•œ 곳에 μ‚½μž…ν•˜μ—¬ μ˜ˆμ™Έ 처리λ₯Ό ν• μˆ˜ μžˆλ‹€.

[μ°Έκ³ ] μ˜ˆμ™Έμ˜ μ’…λ₯˜μ™€ μ˜ˆμ™Έμ— λŒ€ν•œ μ—λŸ¬ 메세지

  1. μ˜ˆμ™Έμ˜ μ’…λ₯˜
    • νŒŒμ΄μ¬μ—μ„œ 기본적으둜 μ‚¬μš©ν•  수 μžˆλŠ” μ˜ˆμ™Έμ˜ μ’…λ₯˜λŠ” λ‹€μ–‘ν•˜λ‹€.
    • λ¨Όμ €, IndexErrorλŠ” 리슀트의 인덱슀 λ²”μœ„λ₯Ό λ„˜μ–΄κ°ˆ λ•Œ μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ™Έμ΄λ‹€. μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ‹€ 데이터가 150개인 쀄 μ•Œμ•˜λŠ”λ°, 151 κ°œκ°€ μžˆμ–΄ 처리λ₯Ό μš”μ²­ν•˜λŠ” 경우 IndexErrorκ°€ ν˜ΈμΆœλœλ‹€.
    • λ‹€μŒμœΌλ‘œ NameErrorλŠ” μ½”λ“œμ—μ„œ ν˜ΈμΆœν•˜λŠ” νŠΉλ³„ν•œ λ³€μˆ˜λͺ…이 없을 λ•Œ ν˜ΈμΆœλ˜λŠ” μ—λŸ¬μ΄λ‹€. 이 μ–Έμ–΄κ°€ 인터프리터 언어이닀 λ³΄λ‹ˆ μ‘΄μž¬ν•˜μ§€ μ•Šμ€ λ³€μˆ˜λ„ μ‹€ν–‰ μ‹œμ μ—μ„œ μž‘μ•„λ‚Έλ‹€ 컴파일러 μ–Έμ–΄μ˜ 경우 μ‹€ν–‰ μ „μ΄λ‚˜ 컴파일러 μ‹œμ μ— μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” κ²ƒκ³ΌλŠ” λŒ€μ‘°μ μ΄λ‹€.
    • κ·Έ 외에 νŒŒμ΄μ¬μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” λ‚΄μž₯ μ˜ˆμ™ΈλŠ” μ•„λž˜μ™€ κ°™λ‹€.
    μ˜ˆμ™Έ λ‚΄μš©
    IndexError 리슀트의 인덱슀 λ²”μœ„λ₯Ό λ„˜μ–΄κ°ˆ λ•Œ
    NameError μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ
    ZeroDivisionError 0으둜 숫자λ₯Ό λ‚˜λˆŒ λ•Œ
    ValueError λ³€ν™˜ν•  수 μ—†λŠ” λ¬Έμžλ‚˜ 숫자λ₯Ό λ³€ν™˜ν•  λ•Œ
    FileNotFoundError μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ„ ν˜ΈμΆœν•  λ•Œ
  2. μ—λŸ¬μ— λŒ€ν•œ μ—λŸ¬ 메세지
  • λ‚΄μž₯ μ˜ˆμ™Έμ™€ ν•¨κ»˜ μ‚¬μš©ν•˜κΈ° 쒋은 것이 μ˜ˆμ™Έμ— λŒ€ν•œ μ—λŸ¬ λ©”μ‹œμ§€μ΄λ‹€.
  • μ•„λž˜ μ½”λ“œμ™€ 같이 except문의 λ§ˆμ§€λ§‰μ— ‘as e’ λ˜λŠ” ‘as λ³€μˆ˜λͺ…’을 μž…λ ₯ν•˜κ³ , ν•΄λ‹Ή λ³€μˆ˜λͺ…을 좜λ ₯ν•˜λ©΄ λœλ‹€. μ‹€ν–‰ κ²°κ³Ό 'division by zero’λΌλŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 확인할 수 μžˆλŠ”λ°, 이 μ—λŸ¬λ©”μ‹œμ§€λŠ” 파이썬 κ°œλ°œμžλ“€μ΄ 사전에 μ •μ˜ν•œ κ²ƒμœΌλ‘œ, νŠΉμ •ν•œ μ—λŸ¬λ₯Ό λΉ λ₯΄κ²Œ 이해할 수 μžˆλ„λ‘ ν•΄μ€€λ‹€.
for i in range(10):
    try:
        print(10 / i)
    except ZeroDivisionError as e:
        print(e)
        print("Not divided by 0")
division by zero 
Not divided by 0 
10.0
5.0 
3.3333333333333335 
2.5
2.0 
1.6666666666666667 
1.4285714285714286 
1.25 
1.1111111111111112

try-except-else λ¬Έ

  • try-except-else문은 if-else λ¬Έκ³Ό λΉ„μŠ·ν•œλ°, ν•΄λ‹Ή μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 경우 μˆ˜ν–‰ν•  μ½”λ“œλ₯Ό else문에 μž‘μ„±ν•˜λ©΄ λœλ‹€.
#try-except-else문의 κΈ°λ³Έ ν˜•νƒœ

try:
    μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯ μ½”λ“œ 
except μ˜ˆμ™Έ νƒ€μž…:
    μ˜ˆμ™Έ λ°œμƒ μ‹œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
else:
    μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ

  • μœ„ μ½”λ“œλŠ” 10을 i둜 λ‚˜λˆ„λŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ μ œλŒ€λ‘œ λ‚˜λˆ„μ—ˆμ„ 경우 else문에 μ˜ν•œ κ²°κ³Όκ°€ 화면에 좜λ ₯되고, 그렇지 μ•Šμ„ 경우 except문에 μ˜ν•΄ 사전에 μ •μ˜λœ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” μ½”λ“œμ΄λ‹€.
for i in range(10):
    try:
        result = 10 / i
    except ZeroDivisionError:
        print("Not divided by 0")
    else:
        print(10 / i)
Not divided by 0 
10.0
5.0
3.3333333333333335 
2.5
2.0 
1.6666666666666667 
1.4285714285714286 
1.25 
1.1111111111111112
  • 이 μ½”λ“œμ—μ„œμ²˜λŸΌ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 경우의 μˆ˜ν–‰λ¬Έμ„ μ •μ˜ν•΄ λ†“μœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ„ 일어날 일을 μ‚¬μš©μžκ°€ μ •ν™•νžˆ μ˜ˆμΈ‘ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€. ν•˜μ§€λ§Œ 일반적으둜 많이 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œμ΄λ©° μ˜ˆμ™Έκ°€ 많이 λ°œμƒν•˜λŠ” μƒν™©μ—μ„œ κ°„ν˜Ή μ‚¬μš©ν•  수 μžˆλŠ” μ½”λ“œμ΄λ‹€. 예λ₯Ό λ“€μ–΄, μ„œλ²„μ˜ μƒνƒœκ°€ λΆˆμ•ˆν•΄ μ—°κ²° λŠκΉ€ (connection loss)이 자주 λ°œμƒν•œλ‹€λ©΄ 연결이 λ˜μ—ˆμ„ λ•Œ μ²˜λ¦¬ν•  μ½”λ“œλ₯Ό λͺ…ν™•νžˆ ν•˜λŠ” 것이 μ’‹λ‹€.

try-except-finally문

  • try-except-finallyλ¬Έμ—μ„œ finally문은 try—exceptλ¬Έ μ•ˆμ— μžˆλŠ” μˆ˜ν–‰ μ½”λ“œκ°€ μ•„λ¬΄λŸ° 문제 없이 μ’…λ£Œλ˜μ—ˆμ„ 경우 μ΅œμ’…μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” μ½”λ“œμ΄λ‹€. forλ¬Έμ—μ„œ μ‚¬μš©ν•˜λŠ” finallyλ¬Έκ³Ό μš©λ„κ°€ λΉ„μŠ·ν•˜λ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€
#try-except-finally문의 κΈ°λ³Έ ν˜•νƒœ

try:
    μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯ μ½”λ“œ 
except μ˜ˆμ™Έ νƒ€μž…:
    μ˜ˆμ™Έ λ°œμƒ μ‹œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
finally:
    μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 μ‹€ν–‰λ˜λŠ” μ½”λ“œ
  • try-except-finallyλ¬Έ μ½”λ“œ
try:
    for i in ranged(1, 10):
        result =10 // i
        print(result)
except ZeroDivisionError:
    print("Not divided by 0")
finally:
    print("μ’…λ£Œλ˜μ—ˆλ‹€.")
10 
5 
3 
2
2
1
1
1
1
μ’…λ£Œλ˜μ—ˆλ‹€.
  • 이 μ½”λ“œλŠ” try문이 forλ¬Έ 밖에 μ„ μ–Έλ˜μ–΄ 있고, i κ°€ 1λΆ€ν„° μ‹œμž‘ν•œλ‹€.
  • 사싀상 ZeroDivision- Errorκ°€ λ°œμƒν•  수 μ—†λŠ” μ½”λ“œμ΄λ‹€.
  • μ΄λŸ¬ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ except문은 μ‹€ν–‰λ˜μ§€ μ•Šκ³  λ§ˆμ§€λ§‰μœΌλ‘œ finally문만 μ‹€ν–‰λœλ‹€. try-except-finally문도 forλ¬Έμ—μ„œ finally문을 μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•˜κ²Œ μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 λ°˜λ“œμ‹œ μ‹€ν–‰λ˜λŠ” μ½”λ“œμ΄λ‹€.

raise λ¬Έ

  • raise문은 try—exceptλ¬Έκ³Ό 달리 ν•„μš”ν•  λ•Œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” μ½”λ“œμ΄λ‹€.
  • while True문을 μ‚¬μš©ν•΄ 계속 λ°˜λ³΅λ¬Έμ„ λŒλ €μ•Ό ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν•˜μž. μƒλŒ€λ°© 컴퓨터에 계속 무엇인가λ₯Ό μš”μ²­ν•΄μ•Ό ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄κ³ , μš”μ²­ν•  λ•Œλ§ˆλ‹€ λΉ„μš©μ΄ μ²­κ΅¬λœλ‹€.
  • λ§Œμ•½ μƒλŒ€λ°© 컴퓨터가 κ³ μž₯λ‚˜κ±°λ‚˜ λ¬Έμ œκ°€ 생겨 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ λ˜λŠ” 상황이 λ°œμƒν•œλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ? ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ μƒλŒ€λ°© μ»΄ν“¨ν„°μ—μ„œ 응닡이 μ—†λ‹€λ©΄ κ°•μ œλ‘œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ„λ‘ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€. λ‹€μŒμ€ raise문의 κΈ°λ³Έ ν˜•νƒœμ΄λ‹€.

πŸ’‘ raise μ˜ˆμ™Έ νƒ€μž…(μ˜ˆμ™Έ 정보)

  • raise λ¬Έ μ½”λ“œ
while True:
    value = input("λ³€ν™˜ν•  μ •μˆ˜κ°’μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”: ") 
    for digit in value:
        if digit not in "0123456789":
        raise ValueError("μˆ«μžκ°’μ„ μž…λ ₯ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.") 
    print("μ •μˆ˜κ°’μœΌλ‘œ λ³€ν™˜λœ 숫자-", int(value))
λ³€ν™˜ν•  μ •μˆ˜κ°’μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”: 10 
μ •μˆ˜κ°’μœΌλ‘œ λ³€ν™˜λœ 숫자 -10
λ³€ν™˜ν•  μ •μˆ˜κ°’μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”: ab 
Traceback (most recent call last):
    File "raise.py", line 5, inγ€ˆmodule〉
        raise ValueError("μˆ«μžκ°’μ„ μž…λ ₯ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.")
ValueError: μˆ«μžκ°’μ„ μž…λ ₯ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
  • μœ„ μ½”λ“œλŠ” while True문으둜 반볡문이 계속 λŒμ•„κ°€λŠ” μƒνƒœμ—μ„œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 λ°›λŠ”λ‹€.
  • ν•˜μ§€λ§Œ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 값이 μˆ«μžκ°€ μ•„λ‹Œ κ²½μš°μ—λŠ” μˆ«μžκ°’μ„ μž…λ ₯ν•˜μ§€ μ•Šμ•˜λ‹€κ³  좜λ ₯ν•˜λ©΄μ„œ ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜λŠ” 것을 λͺ©μ μœΌλ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ΄λ‹€. μ΄λ•Œ, μ—λŸ¬μ˜ μ’…λ₯˜λŠ” ValueError둜 μ‚¬μš©μžκ°€ μž…λ ₯을 잘λͺ»ν–ˆμ„ λ•Œ μž…λ ₯이 잘λͺ»λœ 것을 μ•Œλ €μ£Όλ©΄μ„œ μ’…λ£Œν•œλ‹€.

assert λ¬Έ

  • 미리 μ•Œμ•„μ•Ό ν•  μ˜ˆμ™Έ 정보가 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•Šμ„ 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” assertλ¬Έ
  • μ•žμ—μ„œ ifλ¬Έκ³Ό ν•¨κ»˜ raise문을 μ‚¬μš©ν•˜μ—¬ κ°•μ œλ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œμΌ°λŠ”λ°, assert문은 맀우 κ°„λ‹¨ν•˜κ²Œ μ˜ˆμ™Έλ₯Ό λ°œμƒ μ‹œν‚¬ 수 μžˆλ‹€. assert문은 True λ˜λŠ” False의 λ°˜ν™˜μ΄ κ°€λŠ₯ν•œ 함 수λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. λ§Œμ•½ Falseκ°€ λ°˜ν™˜λ˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€. λ‹€μŒμ€ assert문의 κΈ°λ³Έ ν˜•νƒœ 이닀.

πŸ’‘ assert μ˜ˆμ™Έ 쑰건

  • assert λ¬Έ μ½”λ“œ
def get_binary_number(decimal_number):
    assert isinstance(decimal_number, int)
    return bin(decimal_number)
print(get_binary_number(10))
print(get_binary_number("10"))
0b1010                                    #4ν–‰μ‹€ν–‰κ²°κ³Ό 
Traceback (most recent caU last):         #5ν–‰ μ‹€ν–‰ κ²°κ³Ό
    File "<C:/.../assert.py>", line 5, in <module> 
        print (get_binary_number("10"))
    File "C:/.../assert.py", line 2, in get_binary_number 
        assert isinstance(decimal_number, int)
AssertionError
  • 1ν–‰μ—μ„œ get_binary_number() ν•¨μˆ˜λ₯Ό 톡해 μ‹­μ§„μˆ˜λ₯Ό μž…λ ₯λ°›λŠ”λ‹€.
  • ν•˜μ§€λ§Œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžκ°€ 잘λͺ»λœ 인수, 예λ₯Ό λ“€μ–΄ λ¬Έμžμ—΄κ°’μ„ μž…λ ₯ν•  μˆ˜λ„ μžˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 2ν–‰μ—μ„œ assert문을 μ‚¬μš©ν•˜μ˜€λ‹€.
  • isinstance() ν•¨μˆ˜λŠ” μž…λ ₯된 값이 λ‹€μŒμ— λ‚˜μ˜€λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€λ₯Ό ν™•μΈν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 이 μ½”λ“œμ—μ„œ decimal_number λ³€μˆ˜κ°€ μ •μˆ˜ν˜• μΈμ§€λŠ” 4γ€œ 5ν–‰μ—μ„œ 확인할 수 μžˆλ‹€.
  • assert문은 μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ 잘λͺ»λœ μž…λ ₯ μ—¬λΆ€λ₯Ό 사전에 ν™•μΈν•˜μ—¬ λ‚˜μ€‘μ— ν•„μš” μ—†λŠ” 연산을 막아주고, κ²°κ΅­ λ‹€λ₯Έ μ‚¬λžŒμ΄ λ§Œλ“  μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ”λ° 쒋은 κ°€μ΄λ“œκ°€ λœλ‹€.

파일의 κ°œλ…

  • 파일(file)은 컴퓨터λ₯Ό μ‹€ν–‰ν•  λ•Œ κ°€μž₯ 기본이 λ˜λŠ” λ‹¨μœ„μ΄λ‹€.
  • ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” 것은 늘 νŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ” 것이닀. ν•˜μ§€λ§Œ 일반적으둜 μœˆλ„μ˜ GUI ν™˜κ²½μ—μ„œλŠ” νŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ•„λž˜μ™€ 같은 μ•„μ΄μ½˜μ„ λ”λΈ”ν΄λ¦­ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€.

사싀 이것도 μ•„μ΄μ½˜μ„ λ”λΈ”ν΄λ¦­ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” μ•„μ΄μ½˜ κ³Ό μ—°κ²°λœ 파일이 μ‹€ν–‰λ˜λŠ” ꡬ쑰이닀. μ•„μ΄μ½˜μ—μ„œ 마우슀 였λ₯Έμͺ½ λ²„νŠΌμ„ ν΄λ¦­ν•˜κ³  [속성]을 μ„ νƒν•˜λ©΄ μ•„λž˜μ™€ 같은 화면을 λ³Ό 수 μžˆλ‹€.

  • 속성 ν™”λ©΄μ—μ„œ ‘λŒ€μƒ’ ν•­λͺ©μ— μ‹€ν–‰λ˜λŠ” 파일의 κ²½λ‘œκ°€ μžˆλ‹€. 이 경둜λ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•˜μ—¬ μ½˜μ†” 창에 λΆ™μ—¬ λ„£κ³  μ‹€ν–‰ν•˜λ©΄ ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λœλ‹€. λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ μ΄λ ‡κ²Œ 파일이 있기 λ•Œ 문에 μ‹€ν–‰λ˜λŠ” 것이닀.
  • 단지 μ‚¬μš©μžκ°€ νŽΈν•˜κ²Œ μ“°κΈ° μœ„ν•΄ κ°„λ‹¨ν•œ μ•„μ΄μ½˜μ„ λ§Œλ“€μ–΄ μ‚¬μš©ν•  뿐이지, κ·Έ μ΄λ©΄μ—λŠ” λͺ¨λ‘ 파일이 μˆ¨μ–΄ μžˆλ‹€κ³  ν•  수 μžˆλ‹€.

[μ°Έκ³ ]

  • νŒŒμΌμ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ λ¨Όμ € 파일과 디렉터리에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.
  • μœˆλ„μ—μ„œ μ‚¬μš©ν•˜λŠ” νƒμƒ‰κΈ°λŠ” [μœˆλ„]와 [E]ν‚€λ₯Ό ν•¨κ»˜ λˆ„λ₯΄λ©΄ λ‚˜νƒ€λ‚œλ‹€. 이것이 κΈ°λ³Έ 파일 μ‹œμŠ€ν…œμ΄λ‹€. 기본적으둜 파일 μ‹œμŠ€ν…œμ€ 파일과 λ””λ ‰ν„°λ¦¬λ‘œ κ΅¬λΆ„ν•˜λŠ”λ°, μœˆλ„μ—μ„œλŠ” λ””λ ‰ν„°λ¦¬λΌλŠ” μš©μ–΄ λŒ€μ‹  ν΄λ”λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ””λ ‰ν„°λ¦¬λŠ” νŒŒμΌμ„ λ‹΄λŠ” 또 ν•˜λ‚˜μ˜ 파일둜, μ—¬λŸ¬ νŒŒμΌμ„ 포함할 수 μžˆλŠ” 그릇이닀.
  • 파일과 λ‹€λ₯Έ 디렉터리λ₯Ό 포함할 수 μžˆμœΌλ―€λ‘œ 직접 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜μ§€λŠ” μ•Šμ§€λ§Œ λ‹€λ₯Έ νŒŒμΌλ“€μ„ κ΅¬λΆ„ν•˜κ³  논리적인 λ‹¨μœ„λ‘œ νŒŒμΌμ„ 묢을 수 μžˆλ‹€.
  • νŒŒμΌμ€ μ»΄ν“¨ν„°μ—μ„œ λ…Όλ¦¬μ μœΌλ‘œ 정보λ₯Ό μ €μž₯ν•˜λŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„μ΄λ‹€. νŒŒμΌμ€ 일반적으둜 파일λͺ…κ³Ό ν™•μž₯자둜 ꡬ별 ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 파이썬 파일둜 μ €μž₯ κ΄€λ¦¬ν•˜λŠ” νŒŒμΌλ“€μ€ pyλΌλŠ” ν™•μž₯자λ₯Ό 가지고 μžˆλ‹€. ν™•μž₯μžλŠ” κ·Έ 파일의 μ“°μž„μ„ κ΅¬λΆ„ν•˜λŠ” κΈ€μžλ‘œ, hwp, ppt, doc 같은 것듀이 μžˆλ‹€.
  • νŒŒμΌμ€ λ‹€λ₯Έ 정보λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κ³  λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ ν•„μš”ν•œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” λ“± μ—¬λŸ¬ 가지 역할을 ν•œλ‹€. ν”νžˆ 탐색기 ν”„λ‘œκ·Έλž¨μ—μ„œ 파일과 λ””λ ‰ν„°λ¦¬λŠ” 트리 ꡬ쑰둜 ν‘œν˜„λ˜λŠ”λ°, κ·Έ μ΄μœ κ°€ λ°”λ‘œ 디렉터리와 파일이 μ„œλ‘œ 포함 관계λ₯Ό 가지기 λ•Œλ¬Έμ΄λ‹€.

 

파일의 μ’…λ₯˜

  • μ»΄ν“¨ν„°μ—μ„œ 파일의 μ’…λ₯˜λŠ” λ‹€μ–‘ν•˜μ§€λ§Œ 기본적으둜 λ°”μ΄λ„ˆλ¦¬ 파일과 ν…μŠ€νŠΈ 파일 두 κ°€μ§€λ‘œ λΆ„λ₯˜ν•  수 μžˆλ‹€.
  • λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ€ μ»΄ν“¨ν„°λ§Œ 이해할 수 μžˆλŠ” 이진 μ •λ³΄λ‘œ μ €μž₯된 νŒŒμΌμ΄λ‹€. 즉, λΉ„νŠΈ ν˜•νƒœλ‘œ μ €μž₯λ˜μ–΄ λ©”λͺ¨μž₯으둜 μ—΄λ©΄ λ‚΄μš©μ΄ 보이지 μ•Šκ±°λ‚˜ λ‚΄μš©μ„ 확인할 수 μ—†λŠ” νŒŒμΌμ„ λ§ν•œλ‹€. 정보 λ₯Ό 효율적으둜 μ €μž₯ν•˜κΈ° μœ„ν•΄ 파일 μ‹œμŠ€ν…œ λŒ€λΆ€λΆ„μ€ 이진 μ •λ³΄λ‘œ μ €μž₯λœλ‹€. μ—‘μ…€μ΄λ‚˜ μ›Œλ“œ ν”„λ‘œκ·Έλž¨λ“€μ΄ λͺ¨λ‘ 이진 μ •λ³΄λ‘œ μ €μž₯된 이진 νŒŒμΌμ΄λ‹€.
  • ν…μŠ€νŠΈ νŒŒμΌμ€ μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” λ¬Έμžμ—΄λ‘œ μ €μž₯된 νŒŒμΌμ΄λ‹€. μ΄λŸ¬ν•œ νŒŒμΌμ€ λ©”λͺ¨μž₯으둜 κ·Έ λ‚΄μš©μ„ 확인할 수 μžˆλ‹€. μ§€κΈˆκΉŒμ§€ μž‘μ„±ν•œ 파이썬 νŒŒμΌμ΄λ‚˜ HTML μ½”λ“œ 파일 등도 λͺ¨λ‘ 텍 슀트 νŒŒμΌμ΄λ‹€. 생각보닀 λ§Žμ€ 파일이 ν…μŠ€νŠΈ 파일둜 μ €μž₯λ˜μ–΄ μžˆλ‹€.

λ°”μ΄λ„ˆλ¦¬ 파일 ν…μŠ€νŠΈ 파일

- μ»΄ν“¨ν„°λ§Œμ΄ν•΄ν• μˆ˜μžˆλŠ”ν˜•νƒœμΈ 이진(법)ν˜•μ‹μœΌλ‘œ μ €μž₯ 된 파일  
  • 일반적으둜 λ©”λͺ¨μž₯으둜 μ—΄λ©΄ λ‚΄μš©μ΄ κΉ¨μ Έ λ³΄μž„(λ©”λͺ¨μž₯μ—μ„œ 해석 λΆˆκ°€)
  • μ—‘μ…€μ΄λ‚˜ μ›Œλ“œμ™€ 같은 ν”„λ‘œκ·Έλž¨ 파일 | - μ‚¬λžŒλ„ 이해할 수 μžˆλŠ” ν˜•νƒœμΈ λ¬Έμžμ—΄ ν˜•μ‹ 으둜 μ €μž₯된 파일, λ©”λͺ¨μž₯으둜 μ—΄λ©΄ λ‚΄μš© 확인이 κ°€λŠ₯
  • λ©”λͺ¨μž₯에 μ €μž₯된 νŒŒμΌμ΄λ‚˜ HTML 파일, 파이썬 μ½”λ“œ νŒŒμΌλ“± |
  • μ—¬κΈ°μ„œ μ•Œμ•„μ•Ό ν•  점은 ν…μŠ€νŠΈ νŒŒμΌλ„ 사싀 컴퓨터가 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ°”μ΄λ„ˆλ¦¬ ν˜•νƒœλ‘œ μ €μž₯ 된 νŒŒμΌμ΄λΌλŠ” 것이닀.
  • μ‚¬λžŒμ΄ 확인할 수 μžˆλŠ” 파일이라고 ν•΄μ„œ 컴퓨터가 그런 ν˜•νƒœλ‘œ μ €μž₯된 νŒŒμΌμ„ 확인할 수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€. ν…μŠ€νŠΈνŒŒμΌμ€ 컴퓨터가 이해할 수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€κ²½ν•˜μ—¬ μ €μž₯λœλ‹€.
  • ν”νžˆ μ΄λ ‡κ²Œ λ³€κ²½ν•˜λŠ” 기쀀을 μ•„μŠ€ν‚€= ASCIIλ‚˜ μœ λ‹ˆμ½”λ“œUnicode둜 ν•˜κ³ , 이 ν‘œμ€€μ— 따라 ν…μŠ€νŠΈ νŒŒμΌμ„ 컴퓨터가 이해할 수 μžˆλ„λ‘ λ°”κΎΌλ‹€. 즉, μ»΄ν“¨ν„°λŠ” 였직 μ΄μ§„μˆ˜λ§Œ 이해할 수 μžˆμœΌλ―€λ‘œ λͺ¨λ“  λ¬Έμžμ—΄κ°’λ„ μ „λΆ€ μ΄μ§„μˆ˜λ‘œ λ³€κ²½ν•˜μ—¬ μ €μž₯ν•œλ‹€.
  • 예λ₯Ό λ“€μ–΄, ‘AλΌλŠ” λ¬Έμžμ—΄κ°’μ΄ μ΄μ§„μˆ˜λ‘œ 0100010이닀.’λΌλŠ” ν‘œμ€€μ— 따라 우리 λˆˆμ— A둜 λ³΄μ΄λŠ” ν…μŠ€νŠΈλŠ” μ‹€μ œλ‘œ 0100010으둜 μ €μž₯λœλ‹€. λ°˜λŒ€λ‘œ 0100010으둜 μ €μž₯λ˜μ–΄ μžˆλŠ” ν…μŠ€νŠΈ νŒŒμΌμ„ 뢈러올 λ•Œ ν‘œμ€€μ— 따라 A둜 λ‹€μ‹œ λ³€κ²½ν•˜μ—¬ 보여쀀닀.

[μ°Έκ³ ]

  • λͺ¨λ“  ν…μŠ€νŠΈλŠ” μ΄μ§„μˆ˜λ‘œ λ³€ν™˜λ˜μ–΄ μ €μž₯λ˜λ―€λ‘œ 기본적인 λ³€ν™˜ ν‘œμ€€μ΄ λ§Œλ“€μ–΄μ‘Œκ³  κ·Έ ν‘œμ€€μ„ μ‚¬μš©ν•˜μ—¬ 정보λ₯Ό μ‰½κ²Œ μ €μž₯ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ ν‘œμ€€μ€ μ•„μŠ€ν‚€μ½”λ“œλ‚˜ μœ λ‹ˆμ½”λ“œμ²˜λŸΌ λ‚˜λΌλ³„, μ–Έμ–΄λ³„λ‘œ μ‘΄μž¬ν•œλ‹€. μ–΄λ–€ ν…μŠ€νŠΈλ₯Ό μ΄λŸ¬ν•œ 체계에 맞게 μ €μž₯ν•˜λŠ” 것을 인코딩 (encoding)이라고 ν•œλ‹€.

 

파일 읽기

  • νŒŒμ΄μ¬μ—μ„œλŠ” ν…μŠ€νŠΈ νŒŒμΌμ„ 닀루기 μœ„ν•΄ open() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
  • 일반적으둜 open() ν•¨μˆ˜μ™€ 파일λͺ…, 파일 μ—΄κΈ° λͺ¨λ“œλ₯Ό μž…λ ₯ν•˜λ©΄ κ·Έ μ˜΅μ…˜μ— 따라 νŒŒμΌμ„ λ‹€λ£° 수 μžˆλ‹€.
f = open("파일λͺ…", "파일 μ—΄κΈ° λͺ¨λ“œ") 
f.close()
  • νŒŒμΌμ„ μ—¬λŠ” λͺ¨λ“œμ—λŠ” 읽기 λͺ¨λ“œ, μ“°κΈ° λͺ¨λ“œ, μΆ”κ°€ λͺ¨λ“œ 등이 μžˆλ‹€. νŒŒμ΄μ¬μ—μ„œλŠ” 상황에 따라 μ΄λŸ¬ν•œ ν˜•μ‹μ„ μ‘°ν•©ν•˜μ—¬ νŒŒμΌμ„ λ‹€λ£¨κ²Œ λœλ‹€.

μ’…λ₯˜ μ„€λͺ…

r 읽기 λͺ¨λ“œ:νŒŒμΌμ„ 읽기만 ν•  λ•Œ μ‚¬μš©
w μ“°κΈ° λͺ¨λ“œ:νŒŒμΌμ— λ‚΄μš©μ„ μ“Έ λ•Œ μ‚¬μš©
a μΆ”κ°€ λͺ¨λ“œ:파일의 λ§ˆμ§€λ§‰μ— μƒˆλ‘œμš΄ λ‚΄μš©μ„ μΆ”κ°€ν•  λ•Œ μ‚¬μš©

파일 읽기

f = open ("dream.txt", "r")
contents = f.read()
print(contents) 
f.close()
I have a dream a song to sing
to help me cope with anything
if you see the wonder of a fairy tale 
you can take the future even
if you fail I believe in angels 
something good in everything
  • 1ν–‰μ—μ„œ open() ν•¨μˆ˜ λ‹€μŒμ— 파일λͺ…κ³Ό ‘r’을 μž…λ ₯ν•΄ νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό λ³€μˆ˜ f에 μ €μž₯ν•˜μ˜€λ‹€. 이λ₯Ό 일반적으둜 파일 객체라고 ν•œλ‹€.
  • 2ν–‰μ—μ„œ λ³€μˆ˜ fλ₯Ό μ΄μš©ν•΄ read() ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©΄ ν•΄λ‹Ή 파일의 ν…μŠ€νŠΈλ₯Ό contents λ³€μˆ˜μ— λ¬Έμžμ—΄λ‘œ μ €μž₯ν•œλ‹€.
  • 3ν–‰μ—μ„œλŠ” contents λ³€μˆ˜μ˜ λ‚΄μš©, 즉 ‘dream.txt’ νŒŒμΌμ— μžˆλŠ” ν…μŠ€νŠΈλ₯Ό 화면에 좜λ ₯ν•œλ‹€.
  • 4ν–‰μ—μ„œλŠ” λ§ˆμ§€λ§‰μœΌλ‘œ close() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ νŒŒμΌμ„ μ’…λ£Œν•œλ‹€.
  • λ•Œλ•Œλ‘œ ν…μŠ€νŠΈ νŒŒμΌμ„ λ‹€λ£° λ•Œ 이미 μˆ˜μ •ν•˜κ³  μžˆλŠ” νŒŒμΌμ„ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ λ™μ‹œμ— ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ‚˜μ˜ 파이썬 ν”„λ‘œκ·Έλž¨μ΄ ν•˜λ‚˜μ˜ νŒŒμΌμ„ μ‚¬μš©ν•  λ•Œ μ‚¬μš©μ„ μ™„λ£Œν•˜λ©΄ λ°˜λ“œμ‹œ ν•΄λ‹Ή νŒŒμΌμ„ μ’…λ£Œν•΄μ•Ό ν•œλ‹€.

with λ¬Έκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜κΈ°

  • withλ¬Έκ³Ό ν•¨κ»˜ open() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
  • with문은 λ“€μ—¬μ“°κΈ°λ₯Ό ν•˜λŠ” λ™μ•ˆμ—λŠ” open() ν•¨μˆ˜κ°€ μœ μ§€λ˜κ³ , λ“€μ—¬μ“°κΈ°κ°€ λλ‚˜λ©΄ open() ν•¨μˆ˜λ„ μ’…λ£Œλ˜λŠ” 방식이닀.
  • 차이점은 close() ν•¨μˆ˜λ₯Ό λͺ…μ‹œμ μœΌλ‘œ 쓰지 μ•Šμ•„λ„ 파일의 μ‚¬μš©μ„ μ’…λ£Œν•  수 μžˆλ‹€λŠ” 점이닀. 특히 ν•΄λ‹Ή 파일 κ°μ²΄λŠ” =둜 ν• λ‹Ήν•˜λŠ” 방식이 μ•„λ‹ˆλΌ as문을 μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λͺ…에 ν• λ‹Ή ν•œλ‹€.
with open("dream.txt", "r") as my_file:
    contents = my_file.read()
    print(type(contents), contents)
<class 'str'> I have a dream a song to sing 
to help me cope with anything
if you see the wonder of a fairy tale
you can take the future even
if you fail I believe in angels
something good in everything

ν•œ 쀄씩 읽어 λ¦¬μŠ€νŠΈν˜•μœΌλ‘œ λ°˜ν™˜ν•˜κΈ°

  • 파일 μ „μ²΄μ˜ ν…μŠ€νŠΈλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•˜λŠ” read() ν•¨μˆ˜ λŒ€μ‹ , readlines() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•œ 쀄씩 λ‚΄μš©μ„ 읽어와 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ μ €μž₯ν•  수 μžˆλ‹€.
  • ν•œ μ€„μ˜ 기쀀은 \n으둜 λ‚˜λ‰˜μ–΄μ§€κ³  리슀트둜 λ°˜ν™˜λ  λ•Œ forλ¬Έ λ“± λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ ν™œμš©ν•  수 μžˆλ‹€.
with open("dream.txt","r") as my_file:
    content_list = my_file.readlines()   # 파일 전체λ₯Ό 리슀트둜 λ°˜ν™˜
    print (type(content_list))           # μžλ£Œν˜• 확인
    print(content_list)                  # λ¦¬μŠ€νŠΈκ°’ 좜λ ₯
<class 'list'〉
['I have a dream a song to sing \\n', 'to help me cope with anything \\n', 'if you 
see the wonder of a fairy tale \\n', 'you can take the future even \\n', 'if you 
fail. I believe in angels \\n', 'something good in everything \\n']

μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ ν•œ 쀄씩 읽어 였기

  • μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μ°¨λ‘€λŒ€λ‘œ ν•œ 쀄씩 μ½μ–΄μ˜€λŠ” ν•¨μˆ˜μΈ readline()에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.
  • κΈ°μ‘΄ read() ν•¨μˆ˜λŠ” νŒŒμΌμ„ ν•œ 번 μ—΄ λ•Œ 파일의 μ²˜μŒλΆ€ν„° λκΉŒμ§€ λͺ¨λ“  파일의 λ‚΄μš©μ„ μ½μ–΄μ˜€λŠ” ν•¨μˆ˜μ΄μ§€λ§Œ, readline() ν•¨μˆ˜λŠ” 호좜될 λ•Œλ§ˆλ‹€ ν•œ 쀄씩 μ½μ–΄μ˜€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.
with openC'dream.txt", "r") as my_file:
    i=0
    while 1:
        line = my_file.readline()
        if not line:
            break
        print(str(i)+" === "+ line.replace("\\n","")) #ν•œ 쀄씩 κ°’ 좜λ ₯
        i=i+1
0 === I have a dream a song to sing
1 === to help me cope with anything
2 === if you see the wonder of a fairy tale
3 === you can take the future even
4 ===ifyoufailIbelieveinangels
5 === something good in everything
  • μ½”λ“œλ₯Ό 보면 3ν–‰μ—μ„œ while 1둜 μ½”λ“œκ°€ 항상 μˆ˜ν–‰λ˜λ„λ‘ λ§Œλ“  λ‹€μŒ, 4ν–‰μ˜ line = my_file.readline()으둜 ν•œ 쀄씩 νŒŒμΌμ„ 읽어듀인닀.
  • λ§Œμ•½ μ½μ–΄μ˜¨ 쀄에 λ‚΄μš©μ΄ μ—†λ‹€λ©΄ 5ν–‰μ˜ if not line: break μ½”λ“œμ— μ˜ν•΄ 반볡문이 μ’…λ£Œλ˜μ–΄ 파일 읽기λ₯Ό μ’…λ£Œν•œλ‹€. ν•˜μ§€λ§Œ νŒŒμΌμ— 남은 λ‚΄μš©μ΄ μžˆλ‹€λ©΄ while문이 계속 μ‹€ν–‰λ˜λ©΄μ„œ λͺ¨λ“  μ½”λ“œλ₯Ό λ‹€ μ½μ–΄μ˜€κ²Œ λœλ‹€. 일반적으둜 파일의 λ‚΄μš©μ„ μ°Ύλ‹€κ°€ 쀑간에 λ©ˆμΆ°μ•Ό ν•  ν•„μš”κ°€ μžˆλŠ” λŒ€μš©λŸ‰ λ°μ΄ν„°λŠ” μœ„μ™€ 같은 μ½”λ“œλ₯Ό 많이 μ‚¬μš©ν•œλ‹€.

νŒŒμΌμ— μ €μž₯된 κΈ€μžμ˜ 톡계 정보 좜λ ₯ν•˜κΈ°

  • λ•Œλ‘œλŠ” νŒŒμΌμ— μ €μž₯된 ν…μŠ€νŠΈμ˜ 톡계 정보λ₯Ό 읽어와야 ν•  λ•Œκ°€ μžˆλ‹€. 이λ₯Ό μœ„ν•΄ 많이 μ‚¬μš©ν•˜λŠ” 방법은 이미 배운 split() ν•¨μˆ˜μ™€ len() ν•¨μˆ˜λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 것이닀.
  • μ•„λž˜ μ½”λ“œλŠ” νŒŒμΌμ— μ €μž₯된 λͺ¨λ“  ν…μŠ€νŠΈλ₯Ό μ½μ–΄μ˜¨ ν›„ μ°¨λ‘€λŒ€λ‘œ κΈ€μž 수, 단어 수, 쀄 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.
with open("dream.txt", "r") as my_file:
    contents = my_file.read()
    word_list = contents.split("")   #빈칸 κΈ°μ€€μœΌλ‘œ 단어λ₯Ό λΆ„λ¦¬ν•˜μ—¬ 리슀트
    line_list = contents.split("\\n") #ν•œ 쀄씩 λΆ„λ¦¬ν•˜μ—¬ 리슀트

print("μ΄κΈ€μžμ˜μˆ˜:",len(contents))
print("총 λ‹¨μ–΄μ˜ 수:", len(word_list))
print("총 μ€„μ˜ 수:,', len(line_list))
총 κΈ€μžμ˜ 수 188   #6ν–‰ μ‹€ν–‰κ²°κ³Ό
총 λ‹¨μ–΄μ˜ 수: 35   #7ν–‰ μ‹€ν–‰κ²°κ³Ό
총 μ€„μ˜ 수: 7      #8ν–‰ μ‹€ν–‰κ²°κ³Ό

 

파일 μ“°κΈ°

  • νŒŒμΌμ— 무엇인가λ₯Ό μ“°κΈ° μœ„ν•΄μ„œλŠ” 파일 μ—΄κΈ° λͺ¨λ“œλ₯Ό ‘W’둜 μ„€μ •ν•˜λŠ” 것과 ν•¨κ»˜ μΈμ½”λ”©μ΄λΌλŠ” κ°œλ…μ„ μ•Œμ•„μ•Ό ν•œλ‹€.
  • ν…μŠ€νŠΈ νŒŒμΌμ„ μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ €μž₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν‘œμ€€μ„ 지 μ •ν•΄μ•Ό ν•˜λŠ”λ°, 이것을 인코딩이라고 ν•œλ‹€.
  • 인코딩 μ˜΅μ…˜μœΌλ‘œ 인코딩 ν‘œμ€€μ„ 지정할 수 μžˆλ‹€. 일반적으둜 인코딩은 utf 8을 많이 μ‚¬μš©ν•˜λ©°, νŒŒμΌμ„ μœˆλ„μ—μ„œλ§Œ μ‚¬μš©ν•œλ‹€λ©΄ cp949도 μ‚¬μš©ν•  수 μžˆλ‹€. 인코딩은 μš΄μ˜μ²΄μ œλ‚˜ 파일의 μ‚¬μš© ν™˜κ²½μ— 따라 λ‹€λ₯΄κ²Œ μ„€μ •ν•΄μ•Ό ν•œλ‹€.
  • μ•„λž˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ ‘count_log.txt’λΌλŠ” νŒŒμΌμ„ ‘w’ μ˜΅μ…˜μœΌλ‘œ μ½μ–΄μ˜¨ ν›„ 1λΆ€ν„° 10κΉŒμ§€ 의 숫자λ₯Ό λ„£μ–΄ ‘1번째 쀄이닀.’λΆ€ν„° ‘10번째 쀄이닀.’κΉŒμ§€ λ¬Έμžμ—΄μ„ λ§Œλ“  λ‹€μŒ f .write(data)μ½”λ“œλ‘œ count_log.txt νŒŒμΌμ— μ°¨λ‘€λŒ€λ‘œ κΈ°λ‘ν•œλ‹€. λͺ¨λ“  λ‚΄μš©μ„ κΈ°λ‘ν•œ 후에 f.close() μ½”λ“œλ‘œ ν•΄λ‹Ή νŒŒμΌμ„ λ‹«λŠ”λ‹€.
f = open("count_log.txt", 'w', encoding = "utf8")
for i in range(l,ll):
    data ="%d번째 쀄이닀.\\n"%i
    f.write(data)
f.close()
  • 기쑴의 count_ log.txt 파일이 μžˆμŒμ—λ„ λ‹€μ‹œ ν•œλ²ˆ w둜 νŒŒμΌμ„ λΆ€λ₯΄λ©΄ κΈ°μ‘΄ 파일이 μ‚­μ œλ˜κ³  μƒˆλ‘œμš΄ 파일이 생겨 μƒˆλ‘œμš΄ λ‚΄μš©λ§Œ κΈ°λ‘λœλ‹€. 상황에 따라 κΈ°μ‘΄ νŒŒμΌμ— 계속 μΆ”κ°€ν•΄μ•Ό ν•˜λŠ” μž‘μ—…μ΄ μžˆμ„ μˆ˜λ„ μžˆλ‹€. 이 경우 많이 μ‚¬μš©ν•˜λŠ” 방법은 μΆ”κ°€ λͺ¨λ“œ aλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

파일 μ—΄κΈ° λͺ¨λ“œ a둜 μƒˆλ‘œμš΄ κΈ€ μΆ”κ°€ν•˜κΈ°

  • μ“°κΈ° λͺ¨λ“œμΈ wλŠ” 늘 μƒˆλ‘œμš΄ νŒŒμΌμ„ μƒμ„±ν•œλ‹€.
with open("count_log.txt", 'a', encoding = "utf8") as f:
    for i in range(1, 11):
        data = "%d번째 쀄이닀.\\n"%i
        f.write(data)
  • 기쑴에 countjog.txt 파일이 μžˆλ‹€λŠ” κ°€μ •μ—μ„œ ‘a’ λͺ¨λ“œλ‘œ νŒŒμΌμ„ μ—°λ‹€. μ½”λ“œλ₯Ό μˆ˜ν–‰ν•  λ•Œ λ§ˆλ‹€ ν•΄λ‹Ή νŒŒμΌμ— ‘1번째 쀄이닀.’λΆ€ν„° ‘10번째 쀄이닀.’λΌλŠ” ν…μŠ€νŠΈκ°€ 계속 μΆ”κ°€λœλ‹€.

디렉터리 λ§Œλ“€κΈ°

  • νŒŒμ΄μ¬μœΌλ‘œλŠ” 파일만 λ‹€λ£¨λŠ” 것이 μ•„λ‹ˆλΌ 디렉터리도 ν•¨κ»˜ λ‹€λ£° 수 μžˆλ‹€.
  • os λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ 디렉터리λ₯Ό μ‰½κ²Œ λ§Œλ“€ 수 있으며 λ””λ ‰ν„° 리λ₯Ό μƒμ„±ν•˜λŠ” μ½”λ“œλŠ” log이닀.
import os
os.mkdir("log")

폴더 μ•„λž˜μ— logλΌλŠ” μƒˆλ‘œμš΄ 폴더가 생성

 

  • ν•˜μ§€λ§Œ ν”„λ‘œκ·Έλž¨ λŒ€λΆ€λΆ„μ΄ μƒˆλ‘œ μ‹€ν–‰λ˜λ―€λ‘œ 기쑴에 ν•΄λ‹Ή 디렉터리가 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” μ½”λ“œκ°€ ν•„μš”ν•˜λ‹€. 이 경우 os.path.isdir μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°μ‘΄ λ””λ ‰ν„°λ¦¬μ˜ 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•˜λ©΄ λœλ‹€.
import os
os.mkdir("log")

if not os.path.isdir("log"):
    os.mkdir("log")
Traceback (most recent call last):
    File "mkdir2.py", line 2, in <modulo>
        os.mkdir("log")
FileExistsError: [WinError 183] 파일이 이미 μžˆμœΌλ―€λ‘œ λ§Œλ“€ 수 μ—†μŠ΅λ‹ˆλ‹€: 'log'

둜그 파일 λ§Œλ“€κΈ°

  • μ΄λ²ˆμ—λŠ” μ‹€μ œ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 둜그 파일 log file
  • 둜그 νŒŒμΌμ€ ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•˜λŠ” λ™μ•ˆ μ—¬λŸ¬ 가지 쀑간 기둝을 μ €μž₯ν•˜λŠ” 역할을 ν•˜λŠ” νŒŒμΌμ΄λ‹€. 예λ₯Ό λ“€μ–΄ μ›Ή ν”„λ‘œκ·Έλž¨μ˜ 경우 μ™ΈλΆ€ μ ‘μ†μžμ˜ 접속 κΈ°λ‘μ΄λ‚˜ 접속 μ‹œκ°„ 등을 μ €μž₯ν•˜λŠ” 파일이 둜그 νŒŒμΌμ΄λ‹€.
#둜그 νŒŒμΌμ„ μƒμ„±ν•˜λŠ” μ½”λ“œ

import os 

if not os.path.isdir("log"):
    os.mkdir("log")

if not os .path .exists("log/count_log .txt"):
    f = open("log/count_log.txt", 'w', encoding = "utf8")
    f.write("기둝이 μ‹œμž‘λœλ‹€.\\n")
    f.close()

with open("log/count_log.txt", 'a', encoding = "utf8") as f:
    import random, datetime
    for i in range(1, 11):
        stamp = str(datetime .datetime .now())
        value = random.random()* 1000000
        logJLine = stamp + "\\t" + str(value) + "값이 μƒμ„±λ˜μ—ˆλ‹€."+"\\n"
        f.write(log_line)
  • 3γ€œ4ν–‰μ—μ„œλŠ” log 디렉터리가 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 μƒˆλ‘­κ²Œ 디렉터리λ₯Ό λ§Œλ“ λ‹€.
  • 6γ€œ9ν–‰μ—μ„œλŠ” 기쑴에 ν•œ λ²ˆλ„ 둜그 기둝이 μ—†μ—ˆλ‹€λ©΄ ‘w’ λͺ¨λ“œλ‘œ count_log.txt νŒŒμΌμ„ μƒμ„±ν•˜κ³  기둝의 μ‹œμž‘μ„ μ•Œλ¦¬λŠ” 문ꡬλ₯Ό μ €μž₯ν•œλ‹€.
  • 11γ€œ17행은 μ˜ˆμ‹œλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μž„μ˜λ‘œ μ‹œκ°„ 기둝과 ν•¨κ»˜ μž„μ˜μ˜ 숫자λ₯Ό 문ꡬ μ•ˆμ— 계속 κΈ°λ‘ν•˜μ—¬ μ €μž₯ν•œλ‹€.
  • μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ λ”± 10번의 기둝을 μ‹œν–‰ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” ν•΄λ‹Ή μ½”λ“œκ°€ ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ μ‹œκ°„κ³Ό ν•¨κ»˜ μž„μ˜μ˜ μˆ«μžκ°€ 계속 κΈ°λ‘λœλ‹€.

 

pickle λͺ¨λ“ˆ

  • 파이썬 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ μƒμ„±λ˜λŠ” μ—¬λŸ¬ λ³€μˆ˜μ™€ κ°μ²΄λŠ” μˆœκ°„μ μœΌλ‘œ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ˜μ—ˆλ‹€κ°€ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ©΄ 사라진닀. ν•˜μ§€λ§Œ λ•Œλ‘œλŠ” μ΄λ ‡κ²Œ μ‚¬μš©λ˜λŠ” 객체λ₯Ό μ €μž₯μ‹œμΌœ 놓고 ν•„μš”ν•  λ•Œ λ‹€μ‹œ λΆˆλŸ¬μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.
  • 이 경우λ₯Ό ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” μ˜μ†ν™”λΌκ³  ν•œλ‹€.
  • κ°„λ‹¨νžˆ ν‘œν˜„ν•˜λ©΄ ν•„μš”ν•œ 객체λ₯Ό 파일둜 μ €μž₯μ‹œμΌœ λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀. νŒŒμ΄μ¬μ€ pickle λͺ¨λ“ˆμ„ μ œκ³΅ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λœ 객체λ₯Ό μ˜μ†ν™” ν•  수 μžˆλ„λ‘ μ§€μ›ν•œλ‹€. λ¦¬μŠ€νŠΈμ— λ“€μ–΄κ°„ λ°μ΄ν„°λ‚˜ 클래슀의 였브젝트 등을 파일둜 μ €μž₯μ‹œμΌœ λ‚˜μ€‘μ— λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.
  • pickle λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒ μ½”λ“œμ™€ 같이 ν˜ΈμΆœν•œ ν›„ 객체λ₯Ό μ €μž₯ν•  수 μžˆλŠ” νŒŒμΌμ„ μ—΄κ³  μ €μž₯ν•˜κ³ μž ν•˜λŠ” 객체λ₯Ό λ„˜κΈ°λ©΄ λœλ‹€.
  • νŒŒμΌμ„ 생성할 λ•ŒλŠ” ‘w’κ°€ μ•„λ‹Œ ‘wb’둜 μ—΄μ–΄μ•Ό ν•˜λŠ”λ°. μ—¬κΈ°μ„œ BλŠ” λ°”μ΄λ„ˆλ¦¬λ₯Ό λœ»ν•˜λŠ” μ•½μžλ‘œ ν…μŠ€νŠΈ 파일이 μ•„λ‹Œ λ°”μ΄λ„ˆλ¦¬ 파일둜 μ €μž₯λœλ‹€λŠ” μ˜λ―Έμ΄λ‹€. dump() ν•¨μˆ˜μ—μ„œλŠ” μ €μž₯ν•  객체, μ €μž₯될 파일 객체λ₯Ό μ°¨λ‘€λŒ€λ‘œ 인수둜 λ„£μœΌλ©΄ ν•΄λ‹Ή 객체가 ν•΄λ‹Ή νŒŒμΌμ— μ €μž₯λœλ‹€.
>>> import pickle
>>>
>>> f = open("list.pickle", "wb") 
>>> test = [1, 2, 3, 4, 5]
>>> pickle.dump(test, f)
>>> f.close()
  • μ €μž₯된 pickle νŒŒμΌμ„ λΆˆλŸ¬μ˜€λŠ” ν”„λ‘œμ„ΈμŠ€λ„ μ €μž₯ ν”„λ‘œμ„ΈμŠ€μ™€ κ°™λ‹€.
  • λ¨Όμ € list.pickle νŒŒμΌμ„ ‘rb’ λͺ¨λ“œλ‘œ μ½μ–΄μ˜¨ ν›„, ν•΄λ‹Ή 파일 객체λ₯Ό pickle λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜μ—¬ load() ν•¨μˆ˜λ‘œ 뢈러였면 λœλ‹€.
  • 사싀 pickle 객체λ₯Ό 뢈러올 λ•Œ ν•΄λ‹Ή 객체가 μ–΄λ–€ 객체인지에 λŒ€ν•œ 정보가 μ „ν˜€ μ—†μ–΄ μƒλ‹Ήνžˆ ν˜Όλž€μŠ€λŸ¬μšΈ λ•Œλ„ μžˆμ§€λ§Œ, ν•΄λ‹Ή μ½”λ“œλ₯Ό κ°œλ°œν•œ 개발자라면 μ½”λ“œμ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •ν™•νžˆ μ•Œκ³  μžˆμœΌλ―€λ‘œ 어렀움 없이 μ‚¬μš©ν•  수 μžˆλ‹€. λ‹€μŒ 파이썬 μ…Έ μ½”λ“œλŠ” μ•žμ—μ„œ 리슀트 객체λ₯Όnlist.pickle νŒŒμΌμ— μ €μž₯ν–ˆκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή νŒŒμΌμ„ 뢈러 μ‚¬μš©ν•  λ•Œλ„ λ™μΌν•˜κ²Œ 리슀트 객체가 λ°˜ν™˜λœ 것을 μ•Œ 수 μžˆλ‹€.
>>> f = open("list.pickle", "rb") 
>>> test_pickle = pickle.load(f) 
>>> print(test_pickle)
[1, 2, 3, 4, 5]
>>> f.close()
  • pickle λͺ¨λ“ˆμ€ λ‹¨μˆœνžˆ μƒμ„±λœ 객체λ₯Ό μ €μž₯ν•˜λŠ” κΈ°λŠ₯도 μžˆμ§€λ§Œ μ‚¬μš©μžκ°€ 직접 μƒμ„±ν•œ 클래슀 객체도 μ €μž₯ν•œλ‹€.
  • λ‹€μŒ μ½”λ“œμ™€ 같이 κ³±μ…ˆμ„ μ²˜λ¦¬ν•˜λŠ” 클래슀λ₯Ό μƒμ„±ν•œλ‹€κ³  κ°€μ •ν•˜μž. 이 μ½”λ“œμ˜ ν΄λž˜μŠ€λŠ” 처음 객체λ₯Ό 생성할 λ•Œ μ΄ˆκΉƒκ°’μ„ μƒμ„±ν•˜κ³ , multiply() ν•¨μˆ˜λ₯Ό λΆ€λ₯Ό λ•Œλ§ˆλ‹€ ‘μ΄ˆκΉƒκ°’ * number’의 값을 ν˜ΈμΆœν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€. μΌμ’…μ˜ κ³±μ…ˆ 클래슀라고 μƒκ°ν•˜λ©΄ λœλ‹€.
>>> class Mutltiply(object):
...     def__init__(self,multiplier):
...         self.multiplier =multiplier
...     def multiply(self, number):
...         return number*self.multiplier
>>> muliply =Mutltiply(5) 
>>> muliply.multiply(10) 
50
  • ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ‹€ 보면 맀우 λ³΅μž‘ν•œ 연산도 λ”°λ‘œ μ €μž₯ν•˜μ—¬ μ‚¬μš©ν•  λ•Œκ°€ μžˆλ‹€. μ΄λŸ¬ν•œ μ €μž₯ λͺ¨λ“ˆμ„ 효율적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ‹€μŒ μ½”λ“œμ²˜λŸΌ pickle λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 μžˆλ‹€
>>> import pickle 
>>>
>>> f = open("multiply_object.pickle", "wb")
>>> pickle.dump(muliply, f)
>>> f.closeO
>>>
>>> f = open("multiply_object.pickle", "rb")
>>>multiply_pickle=pickle.load(f) 
>>> multiply_pickle.multiply(5)
25