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

[2νŒ€/κΉ€κ°€λ¦Ό, μ΅œλ‹€μ˜ˆ] 10μ£Όμ°¨ 파이썬 μŠ€ν„°λ”” - μ˜ˆμ™Έμ²˜λ¦¬

λ‹€μ˜ˆλ» 2023. 6. 1. 00:13

10μ°¨μ‹œ μ˜ˆμ™Έμ²˜λ¦¬_과제.pdf
0.19MB
10μ°¨μ‹œ μ˜ˆμ™Έμ²˜λ¦¬_κ³Όμ œλ‹΅μ•ˆ.pdf
0.20MB

μ°Έκ³ λ„μ„œ : 데이터 과학을 μœ„ν•œ 파이썬 ν”„λ‘œκ·Έλž˜λ°, μ΅œμƒμ² 

 

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

μ˜ˆμ™Έ : ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λ©΄μ„œ μ˜ˆμƒμΉ˜ λͺ»ν•œ 상황이 λ°œμƒν•˜λŠ” 것

ex) μ‚¬μš©μžμ˜ μž…λ ₯ 였λ₯˜

μ‚¬μš©μžκ°€ ν•œκΈ€ 아이디 생성 (영문자, 숫자만 μ§€μ›ν•˜λŠ” ν”„λ‘œκ·Έλž¨) → μž…λ ₯된 ν•œκΈ€μ΄ 아무 문제 없이 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯되면 μ‚¬μš©μžκ°€ ν•΄λ‹Ή μ›Ή μ‚¬μ΄νŠΈμ— λ‘œκ·ΈμΈν•˜μ§€ λͺ»ν•  수 있음

ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ‹€μˆ˜λ‘œ 인코딩에 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ— ν•œκΈ€μ΄ 잘λͺ» μ €μž₯될 수 도 있기 λ•Œλ¬Έ

ex) MS μ˜€ν”ΌμŠ€μ˜ μžλ™ μ €μž₯ κΈ°λŠ₯

κ°‘μžκΈ° 컴퓨터가 μ’…λ£Œλ˜μ—ˆμ„ λ•Œλ₯Ό λŒ€λΉ„ν•˜μ—¬ μž‘μ—…λ¬Όμ„ 쀑간 μžλ™ μ €μž₯ν•΄μ£ΌλŠ” κΈ°λŠ₯


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

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

λ°œμƒ μ—¬λΆ€λ₯Ό κ°œλ°œμžκ°€ 사전에 인지할 수 μžˆλŠ” μ˜ˆμ™Έ

μ˜ˆμ™Έλ₯Ό μ˜ˆμΈ‘ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έκ°€ λ°œμƒν•  λ•ŒλŠ” μ–΄λ–»κ²Œ λŒ€μ‘ν• μ§€ λŒ€μ±…μ„ λ§ˆλ ¨ν•  수 있음

ex) ν…μŠ€νŠΈ λ°•μŠ€μ— μ‚¬μš©μžκ°€ μ‹€μˆ˜λ‘œ 잘λͺ»λœ 값을 μž…λ ₯ν•  것 κ°™λ‹€

μ‚¬μš©μžκ°€ μ‹€μ œλ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ— μ €μž₯ν•  것 κ°™λ‹€

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

맀우 λ§Žμ€ νŒŒμΌμ„ μ²˜λ¦¬ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν•  수 있음

ex) 5,000개의 파일이 ν•œ 디렉터리에 있고 κ·Έ 파일λͺ…듀을 λ„˜κ²¨λ°›μ•„ νŒŒμΌμ„ ν•˜λ‚˜μ”© μ½μ–΄λ“€μ΄λŠ” ν”„λ‘œκ·Έλž¨

μ–΄λ–€ νŒŒμΌμ€ μ‹€μ œλ‘œ μ•ˆμ— λ‚΄μš©μ΄ 없을 수 μžˆλŠ”λ°, 이런 κ²½μš°μ—λ„ μ–΄λ–€ 처리λ₯Ό ν•˜μ§€ λͺ»ν•˜κ³  λ„˜μ–΄κ°„λ‹€

λŠ” νŒŒμΌμ„ 읽고 μžˆλŠ”λ° λ‹€λ₯Έ μ‚¬μš©μžμ— μ˜ν•΄ ν•΄λ‹Ή 파일이 μ‚­μ œλ˜μ–΄ μ½μ–΄λ“€μ΄λŠ” μ‹œμ μ— ν•΄λ‹Ή 파일이 μ‚¬λΌμ§€λŠ” κ²½μš°λ„ λ°œμƒ

ex) 인덱슀의 λ²”μœ„λ₯Ό λ„˜μ–΄κ°€λŠ” 리슀트의 호좜

μ •μˆ˜λ₯Ό 0으둜 λ‚˜λˆ„λŠ” 것 등에 λŒ€ν•œ 문제

인터프리터가 μžλ™μœΌλ‘œ 이것이 μ˜ˆμ™ΈλΌκ³  μ‚¬μš©μžμ—κ²Œ μ•Œλ €μ€Œ

λŒ€λΆ€λΆ„μ€ μ΄λŸ¬ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄μ„œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ―€λ‘œ μ μ ˆν•œ 쑰치λ₯Ό ν•΄μ•Ό 함

λ‹¨μˆœνžˆ 파일이 μ—†λ‹€κ³  μ•Œλ €μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ 파일이 μ—†κΈ° λ•Œλ¬Έμ— μΆ”κ°€λ‘œ ν•΄μ•Ό ν•˜λŠ” μ‘° μΉ˜κ°€ μžˆλ‹€λ©΄ 그것을 μ˜ˆμ™Έ 처리 ꡬ문에 μΆ”κ°€ν•΄μ•Ό 함

ex) <처리 파일 X → 기둝 → λ‹€μŒ 파일 처리> μž‘μ„±

  • μ˜ˆμ™Έ μ²˜λ¦¬κ°€ μ€‘μš”ν•œ μ΄μœ λŠ” ν”„λ‘œκ·Έλž¨λ„ μΌμ’…μ˜ μ œν’ˆμ΄κΈ° λ•Œλ¬Έ
  • μ œν’ˆμ˜ 완성도λ₯Ό λ†’μ΄λŠ” μ°¨μ›μ—μ„œ μ€‘μš”ν•œ κ°œλ…

μ˜ˆμ™Έ 처리 ꡬ문

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

try문이 forλ¬Έ 밖에 있으면 μ–΄λ–€ 일이 λ°œμƒν• κΉŒ?

→ 반볡문 전체가 μ’…λ£Œ

tryλ¬Έ λ‚΄λΆ€μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ exceptλ¬Έ μ˜μ—­μ— μžˆλŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κ³  tryexcept문이 μ’…λ£Œλœλ‹€. μ΄λ ‡κ²Œ try문을 μ λ‹Ήν•œκ³³μ— μ‚½μž…ν•˜μ—¬ μ˜ˆμ™Έ 처리λ₯Ό ν• μˆ˜ 있음

try-except-else λ¬Έ

if-else λ¬Έκ³Ό λΉ„μŠ·

ν•΄λ‹Ή μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 경우 μˆ˜ν–‰ν•  μ½”λ“œλ₯Ό else문에 μž‘μ„±ν•˜λ©΄ 됨

try: 
    μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯ μ½”λ“œ
except μ˜ˆμ™Έ νƒ€μž…:
    μ˜ˆμ™Έ λ°œμƒ μ‹œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
else: 
    μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
for i in range(10):
    try:
        result = 10 / i
    except ZeroDivisionError:
        printC"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

μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 경우의 μˆ˜ν–‰λ¬Έμ„ μ •μ˜ν•΄ λ†“μœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ„ 일어날 일을 μ‚¬μš©μžκ°€ μ •ν™•νžˆ μ˜ˆμΈ‘ν•  수 μžˆλ‹€λŠ” μž₯점이 있음

ν•˜μ§€λ§Œ 일반적으둜 많이 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œμ΄λ©° μ˜ˆμ™Έκ°€ 많이 λ°œμƒν•˜λŠ” μƒν™©μ—μ„œ κ°„ν˜Ή μ‚¬μš©ν•  수 μžˆλŠ” μ½”λ“œ

ex) μ„œλ²„μ˜ μƒνƒœκ°€ λΆˆμ•ˆν•΄ μ—°κ²° λŠκΉ€ connection loss이 자주 λ°œμƒν•œλ‹€λ©΄ 연결이 λ˜μ—ˆμ„ λ•Œ 처 리할 μ½”λ“œλ₯Ό λͺ…ν™•νžˆ ν•˜λŠ” 것이 μ’‹μŒ

try-except-finally λ¬Έ

은 try—exceptλ¬Έ μ•ˆμ— μžˆλŠ” μˆ˜ν–‰ μ½”λ“œκ°€ μ•„λ¬΄λŸ° λ¬Έμ œμ—†μ΄ μ’…λ£Œλ˜μ—ˆμ„ 경우 μ΅œμ’…μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” μ½”λ“œ

forλ¬Έμ—μ„œ μ‚¬μš©ν•˜λŠ” finallyλ¬Έκ³Ό μš©λ„κ°€ λΉ„μŠ·

try: 
    μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯ μ½”λ“œ
except μ˜ˆμ™Έ νƒ€μž…:
    μ˜ˆμ™Έ λ°œμƒ μ‹œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
finally:
    μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 μ‹€ν–‰λ˜λŠ” μ½”λ“œ
try:
    for i in range (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λ¬Έ 밖에 μ„ μ–Έλ˜μ–΄ 있고, 두가 1λΆ€ν„° μ‹œμž‘ν•œλ‹€. 사싀상 ZeroDivisionErrorκ°€ λ°œμƒν•  수 μ—†λŠ” μ½”λ“œ

μ΄λŸ¬ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ except문은 μ‹€ν–‰λ˜μ§€ μ•Šκ³  λ§ˆμ§€λ§‰μœΌλ‘œ finally문만 싀행됨

try-except-finally문도 forλ¬Έμ—μ„œ finally문을 μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•˜κ²Œ μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 λ°˜λ“œμ‹œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ

raise문

try—exceptλ¬Έκ³Ό 달리 ν•„μš”ν•  λ•Œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” μ½”λ“œ

ex)

while True문을 μ‚¬μš©ν•΄ 계속 λ°˜λ³΅λ¬Έμ„ λŒλ €μ•Ό ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν•˜μž.

μƒλŒ€λ°© 컴퓨터에 계속 무엇인가λ₯Ό μš”μ²­ν•΄μ•Ό ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄κ³ , μš”μ²­ν•  λ•Œλ§ˆλ‹€ λΉ„μš©μ΄ μ²­κ΅¬λœλ‹€. λ§Œμ•½ μƒλŒ€λ°© 컴퓨터가 κ³ μž₯λ‚˜κ±°λ‚˜ λ¬Έμ œκ°€ 생겨 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ λ˜λŠ” 상황이 λ°œμƒν•œλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ μƒλŒ€λ°© μ»΄ν“¨ν„°μ—μ„œ 응닡이 μ—†λ‹€λ©΄ κ°•μ œλ‘œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ„λ‘ μ˜ˆμ™Έλ₯Ό λ°œμƒ μ‹œν‚¬ 수 μžˆλ‹€

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 λ¬Έ

True λ˜λŠ” False의 λ°˜ν™˜μ΄ κ°€λŠ₯ν•œ ν•¨μˆ˜λ₯Ό μ‚¬μš©

Falseκ°€ λ°˜ν™˜λ˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒ

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"))
0bl010 
Traceback (most recent caU last):
    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() ν•¨μˆ˜λ₯Ό 톡해 μ‹­μ§„μˆ˜λ₯Ό μž…λ ₯λ°›μŒ

ν•˜μ§€λ§Œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžκ°€ 잘λͺ»λœ 인수argument, 예λ₯Ό λ“€μ–΄ λ¬Έμžμ—΄κ°’μ„ μž…λ ₯ν•  μˆ˜λ„ 있음

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 2ν–‰μ—μ„œ assert문을 μ‚¬μš©ν•˜μ˜€λ‹€. isinstance() ν•¨μˆ˜λŠ” μž…λ ₯된 값이 λ‹€μŒμ— λ‚˜μ˜€λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€λ₯Ό ν™•μΈν•˜λŠ” ν•¨μˆ˜. 이 μ½”λ“œμ—μ„œ decimal_number λ³€μˆ˜κ°€ μ •μˆ˜ν˜• μΈμ§€λŠ” 4γ€œ 5ν–‰μ—μ„œ 확인 κ°€λŠ₯ assert문은 μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ 잘λͺ»λœ μž…λ ₯ μ—¬λΆ€λ₯Ό 사전에 ν™•μΈν•˜μ—¬ λ‚˜μ€‘μ— ν•„μš” μ—†λŠ” 연산을 막아주고, κ²°κ΅­ λ‹€λ₯Έ μ‚¬λžŒμ΄ λ§Œλ“  μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 데 쒋은 κ°€μ΄λ“œκ°€ 됨


파일의 κ°œλ…

file : 컴퓨터λ₯Ό μ‹€ν–‰ν•  λ•Œ κ°€μž₯ 기본이 λ˜λŠ” λ‹¨μœ„

ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” 것은 늘 νŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ” 것

But, 일반적으둜 μœˆλ„μš°μ˜ GUI ν™˜κ²½μ—μ„œλŠ” μ•„μ΄μ½˜μ„ λ”λΈ”ν΄λ¦­ν•˜μ—¬ 싀행함

→ μ‹€μ œλ‘œλŠ” μ•„μ΄μ½˜κ³Ό μ—°κ²°λœ 파일이 μ‹€ν–‰λ˜λŠ” ꡬ쑰

  • μ•„μ΄μ½˜ → 였λ₯Έμͺ½ 마우슀 → [속성]

‘λŒ€μƒ’ ν•­λͺ©μ— μ‹€ν–‰λ˜λŠ” 파일의 κ²½λ‘œκ°€ 있음

이 경둜λ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•˜μ—¬ μ½˜μ†”μ°½μ— λΆ™μ—¬λ„£κ³  μ‹€ν–‰ν•˜λ©΄ ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ΄ 싀행됨

λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ μ΄λ ‡κ²Œ 파일이 있기 λ•Œλ¬Έμ— μ‹€ν–‰λ˜λŠ” 것


파일의 μ’…λ₯˜

λ°”μ΄λ„ˆλ¦¬ 파일(binary file)

  • μ»΄ν“¨ν„°λ§Œ 이해할 수 μžˆλŠ” 이진 μ •λ³΄λ‘œ μ €μž₯된 파일
  • λΉ„νŠΈ(bit) ν˜•νƒœλ‘œ μ €μž₯λ˜μ–΄ λ©”λͺ¨μž₯으둜 μ—΄λ©΄ λ‚΄μš©μ΄ 보이지 μ•Šκ±°λ‚˜ λ‚΄μš©μ„ 확인할 수 μ—†λŠ” 파일
  • μ •λ³΄μ˜ 효율적 μ €μž₯을 μœ„ν•΄ 파일 μ‹œμŠ€ν…œ λŒ€λΆ€λΆ„μ€ 이진 μ •λ³΄λ‘œ μ €μž₯됨
  • ex) μ—‘μ…€, μ›Œλ“œ

ν…μŠ€νŠΈ 파일(text file)

  • μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” λ¬Έμžμ—΄λ‘œ μ €μž₯된 파일
  • λ©”λͺ¨μž₯으둜 λ‚΄μš© 확인 κ°€λŠ₯
  • ex) 파이썬, HTML μ½”λ“œ 파일
  • 컴퓨터가 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ°”μ΄λ„ˆλ¦¬ ν˜•νƒœλ‘œ μ €μž₯된 νŒŒμΌμž„
  • 컴퓨터가 이해할 수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€κ²½ν•˜μ—¬ μ €μž₯됨 ex) μ•„μŠ€ν‚€μ½”λ“œ, μœ λ‹ˆμ½”λ“œ
  • → λͺ¨λ“  λ¬Έμžμ—΄κ°’λ„ μ „λΆ€ μ΄μ§„μˆ˜λ‘œ λ³€κ²½ν•˜μ—¬ μ €μž₯

πŸ’‘ 인코딩 : ν…μŠ€νŠΈλ₯Ό λ³€ν™˜ ν‘œμ€€ 체계에 맞게 μ €μž₯ν•˜λŠ” 것


파일 읽기

>>> f = open("파일λͺ…", "파일 μ—΄κΈ° λͺ¨λ“œ")
>>> f.close()

파일 읽기

>>> f = open ("dream.txt", "r")   # 파일 객체
>>> contents = f.read()            # ν•΄λ‹Ή 파일의 ν…μŠ€νŠΈλ₯Ό contents λ³€μˆ˜μ— λ¬Έμžμ—΄λ‘œ μ €μž₯
>>> print(contents)                # ‘dream.txt’ νŒŒμΌμ— μžˆλŠ” ν…μŠ€νŠΈλ₯Ό 화면에 좜λ ₯
>>> 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

λ•Œλ•Œλ‘œ ν…μŠ€νŠΈ νŒŒμΌμ„ λ‹€λ£° λ•Œ 이미 μˆ˜μ •ν•˜κ³  μžˆλŠ” νŒŒμΌμ„ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ λ™μ‹œμ— ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒ

ν•˜λ‚˜μ˜ 파이썬 ν”„λ‘œκ·Έλž¨μ΄ ν•˜λ‚˜μ˜ νŒŒμΌμ„ μ‚¬μš©ν•  λ•Œ μ‚¬μš©μ„ μ™„λ£Œν•˜λ©΄ λ°˜λ“œμ‹œ ν•΄λ‹Ή νŒŒμΌμ„ μ’…λ£Œν•΄μ•Ό 함

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

>>> 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

with문은 λ“€μ—¬μ“°κΈ°λ₯Ό ν•˜λŠ” λ™μ•ˆμ—λŠ” open() ν•¨μˆ˜κ°€ μœ μ§€λ˜κ³ , λ“€μ—¬μ“°κΈ°κ°€ λλ‚˜λ©΄ open() ν•¨μˆ˜λ„ μ’…λ£Œλ˜λŠ” 방식

close() ν•¨μˆ˜λ₯Ό λͺ…μ‹œμ μœΌλ‘œ 쓰지 μ•Šμ•„λ„ 파일의 μ‚¬μš©μ„ μ’…λ£Œν•  수 있음

ν•΄λ‹Ή 파일 κ°μ²΄λŠ” =둜 ν• λ‹Ήν•˜λŠ” 방식이 μ•„λ‹ˆλΌ as문을 μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λͺ…에 ν• λ‹Ή

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

>>> 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']

파일 μ „μ²΄μ˜ ν…μŠ€νŠΈλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•˜λŠ” read() ν•¨μˆ˜ λŒ€μ‹ , readlines() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•œ 쀄씩 λ‚΄μš©μ„ 읽어와 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ μ €μž₯ κ°€λŠ₯

ν•œ μ€„μ˜ 기쀀은 \n 으둜 λ‚˜λ‰˜μ–΄μ§€κ³  리슀트둜 λ°˜ν™˜λ  λ•Œ forλ¬Έ λ“± λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ ν™œμš© κ°€λŠ₯

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

>>> with open("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 === if you fail I believe in angels
5 === something good in everything

파일의 λ‚΄μš©μ„ μ°Ύλ‹€κ°€ 쀑간에 λ©ˆμΆ°μ•Ό ν•  ν•„μš”κ°€ μžˆλŠ” λŒ€μš©λŸ‰ 데이터에 μ‚¬μš©λ˜λŠ” μ½”λ“œ

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

νŒŒμΌμ— μ €μž₯된 λͺ¨λ“  ν…μŠ€νŠΈλ₯Ό μ½μ–΄μ˜¨ ν›„ μ°¨λ‘€λŒ€λ‘œ κΈ€μž 수, 단어 수, 쀄 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨

>>> with open("dream.txt", "r") as my_file:
        contents = my_life.read()
        word_list = contents.split(" ")     # 빈칸 κΈ°μ€€μœΌλ‘œ 단어λ₯Ό λΆ„λ¦¬ν•˜μ—¬ 리슀트
        line_list = contents.split("\\n")    # ν•œ 쀄씩 λΆ„λ¦¬ν•˜μ—¬ 리슀트
>>> 
>>> print("총 κΈ€μžμ˜ 수:", len(contents))
>>> print("총 λ‹¨μ–΄μ˜ 수:", len(word_list))
>>> print("총 μ€„μ˜ 수:", len(line_list))
총 κΈ€μžμ˜ 수 188
총 λ‹¨μ–΄μ˜ 수: 35
총 μ€„μ˜ 수: 7

파일 μ“°κΈ°

인코딩 : ν…μŠ€νŠΈ νŒŒμΌμ„ μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ €μž₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν‘œμ€€μ„ 지정

  • 인코딩 μ˜΅μ…˜μœΌλ‘œ 인코딩 ν‘œμ€€μ„ 지정할 수 있음
  • 일반적으둜 utf8을 많이 μ‚¬μš©, νŒŒμΌμ„ μœˆλ„μš°μ—μ„œλ§Œ μ‚¬μš©ν•œλ‹€λ©΄ cp949도 μ‚¬μš©
  • μš΄μ˜μ²΄μ œλ‚˜ 파일의 μ‚¬μš© ν™˜κ²½μ— 따라 λ‹€λ₯΄κ²Œ μ„€μ •
>>> 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’ μ˜΅μ…˜μœΌλ‘œ μ½μ–΄μ˜¨ ν›„

1λΆ€ν„° 10κΉŒμ§€μ˜ 숫자λ₯Ό λ„£μ–΄ ‘1 번째 쀄이닀.’λΆ€ν„° ‘10번째 쀄이닀.’κΉŒμ§€ λ¬Έμžμ—΄μ„ λ§Œλ“¦

f .write(data) μ½”λ“œλ‘œ count_log.txt νŒŒμΌμ— μ°¨λ‘€λŒ€λ‘œ 기둝

λͺ¨λ“  λ‚΄μš©μ„ κΈ°λ‘ν•œ 후에 f.close() μ½”λ“œλ‘œ ν•΄λ‹Ή νŒŒμΌμ„ λ‹«μŒ

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

wλŠ” 늘 μƒˆλ‘œμš΄ νŒŒμΌμ„ 생성

ex) 기쑴의 count_log.txt 파일이 μžˆμŒμ—λ„ λ‹€μ‹œ ν•œλ²ˆ w둜 νŒŒμΌμ„ λΆ€λ₯΄λ©΄ κΈ°μ‘΄ 파일이 μ‚­μ œλ˜κ³  μƒˆλ‘œμš΄ 파일이 생겨 μƒˆλ‘œμš΄ λ‚΄μš©λ§Œ 기둝 됨

κΈ°μ‘΄ νŒŒμΌμ— 계속 μΆ”κ°€ν•΄μ•Ό ν•˜λŠ” μž‘μ—…μ΄ μžˆμ„ 수 → μΆ”κ°€ λͺ¨λ“œ aλ₯Ό μ‚¬μš©

>>> 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")

ν”„λ‘œκ·Έλž¨ λŒ€λΆ€λΆ„μ΄ μƒˆλ‘œ μ‹€ν–‰λ˜λ―€λ‘œ 기쑴에 ν•΄λ‹Ή 디렉터리가 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” μ½”λ“œκ°€ ν•„μš”

>>> 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 폴더λ₯Ό μƒμ„±ν–ˆμœΌλ―€λ‘œ FileExistsErrorκ°€ 결과둜 좜λ ₯

이전에 μƒμ„±λœ log 폴더λ₯Ό μ§€μš°λ©΄ log 폴더가 생성됨

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

μ‹€μ œ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 둜그 νŒŒμΌμ„ λ§Œλ“€μ–΄λ³΄μž

둜그 파일 : ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•˜λŠ” λ™μ•ˆ μ—¬λŸ¬ 가지 쀑간 기둝을 μ €μž₯ν•˜λŠ” 역할을 ν•˜λŠ” 파일

ex) μ›Ή ν”„λ‘œκ·Έλž¨μ˜ 경우 μ™ΈλΆ€ μ ‘μ†μžμ˜ 접속 κΈ°λ‘μ΄λ‚˜ 접속 μ‹œκ°„ 등을 μ €μž₯ν•˜λŠ” 파일

>>> import os
>>>
>>> if not os.path.isdir("log"):
        os.mkdir("log")
>>>
>>> if not os.path.exists("log/count_log.txt"):
        f = open("log/cont_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
            log_line = stamp + "\\t" + str(value) + "값이 μƒμ„±λ˜μ—ˆλ‹€." + "\\n"
            f.wirte(log_line)

log 디렉터리가 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 μƒˆλ‘­κ²Œ 디렉터리λ₯Ό λ§Œλ“¦

λŠ” 기쑴에 ν•œ λ²ˆλ„ 둜그 기둝이 μ—†μ—ˆλ‹€λ©΄ ‘w’ λͺ¨λ“œλ‘œ count_log.txt νŒŒμΌμ„ μƒμ„±ν•˜κ³  기둝의 μ‹œμž‘μ„ μ•Œλ¦¬λŠ” 문ꡬλ₯Ό μ €μž₯

μ˜ˆμ‹œλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μž„μ˜λ‘œ μ‹œκ°„ 기둝과 ν•¨κ»˜ μž„μ˜μ˜ 숫자λ₯Ό 문ꡬ μ•ˆμ— 계속 κΈ°λ‘ν•˜μ—¬ μ €μž₯

λ”± 10번의 기둝을 μ‹œν–‰ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” ν•΄λ‹Ή μ½”λ“œκ°€ ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ μ‹œκ°„κ³Ό ν•¨κ»˜ μž„μ˜μ˜ μˆ«μžκ°€ 계속 기둝됨


pickle λͺ¨λ“ˆ

파이썬 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ μƒμ„±λ˜λŠ” μ—¬λŸ¬ λ³€μˆ˜μ™€ κ°μ²΄λŠ” μˆœκ°„μ μœΌλ‘œ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ˜μ—ˆλ‹€κ°€ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ©΄ 사라짐

λ•Œλ‘œλŠ” μ΄λ ‡κ²Œ μ‚¬μš©λ˜λŠ” 객체λ₯Ό μ €μž₯μ‹œμΌœ 놓고 ν•„μš”ν•  λ•Œ λ‹€μ‹œ λΆˆλŸ¬μ•Ό ν•˜λŠ” κ²½μš°κ°€ 있음

  • μ˜μ†ν™” : ν•„μš”ν•œ 객체λ₯Ό 파일둜 μ €μž₯μ‹œμΌœ λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것

νŒŒμ΄μ¬μ€ pickle λͺ¨λ“ˆμ„ μ œκ³΅ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λœ 객체λ₯Ό μ˜μ†ν™”ν•  수 μžˆλ„λ‘ 지원

λ¦¬μŠ€νŠΈμ— λ“€μ–΄κ°„ λ°μ΄ν„°λ‚˜ 클래슀의 였브젝트 등을 파일둜 μ €μž₯μ‹œμΌœ λ‚˜μ€‘μ— λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆλ„λ‘

μ €μž₯ν•΄μ•Ό ν•˜λŠ” 정보가 λ§Žμ•„μ§€κ³  계산 κ²°κ³Όλ₯Ό μ €μž₯ν•˜μ˜€λ‹€κ°€ λ‚˜μ€‘μ— λ‹€μ‹œ 뢈러 μ‚¬μš©ν•  κ²½μš°μ—λ„ μš”κΈ΄ν•˜κ²Œ μ“Έ 수 μžˆλŠ” κΈ°λŠ₯

>>> import pickle
>>>
>>> f = open("list.pickle, "wb")
>>> test = [1,2,3,4,5]
>>> pickle.dump(test,f)   # (μ €μž₯ν•  객체, μ €μž₯될 파일) -> ν•΄λ‹Ή 객체가 ν•΄λ‹Ή νŒŒμΌμ— μ €μž₯
>>> f.close()

νŒŒμΌμ„ 생성할 λ•ŒλŠ” ‘w’κ°€ μ•„λ‹Œ ‘wb’둜 μ—΄μ–΄μ•Ό ν•˜λŠ”λ°. μ—¬κΈ°μ„œ BλŠ” λ°”μ΄λ„ˆ 리 binaryλ₯Ό λœ»ν•˜λŠ” μ•½μžλ‘œ ν…μŠ€νŠΈ 파일이 μ•„λ‹Œ λ°”μ΄λ„ˆ 리 파일둜 μ €μž₯λœλ‹€λŠ” 의미

>>> f = open("list.pickle", "rb")
>>> test_pickle = pickle.load(f)
>>> print(test_pickle)
[1, 2, 3, 4, 5]
>> f.close

μ €μž₯된 picle νŒŒμΌμ„ λΆˆλŸ¬μ˜€λŠ” ν”„λ‘œμ„ΈμŠ€

pickle 객체λ₯Ό 뢈러올 λ•Œ ν•΄λ‹Ή 객체가 μ–΄λ–€ 객체인지에 λŒ€ν•œ 정보가 μ „ν˜€ μ—†μ–΄ μƒλ‹Ήνžˆ ν˜Όλž€μŠ€λŸ¬μšΈ λ•Œλ„ μžˆμ§€λ§Œ, ν•΄λ‹Ή μ½”λ“œλ₯Ό κ°œλ°œν•œ 개발자라면 μ½”λ“œμ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •ν™•νžˆ μ•Œκ³  μžˆμœΌλ―€λ‘œ 어렀움 없이 μ‚¬μš©ν•  수 있음

λŠ” μ•žμ—μ„œ 리슀트 객체λ₯Ό list.pickle νŒŒμΌμ— μ €μž₯ν–ˆκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή νŒŒμΌμ„ 뢈러 μ‚¬μš©ν•  λ•Œλ„ λ™μΌν•˜κ²Œ 리슀트 객체가 λ°˜ν™˜

>>> 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

μ‚¬μš©μžκ°€ 직접 μƒμ„±ν•œ 클래슀 객체도 μ €μž₯

κ³±μ…ˆμ„ μ²˜λ¦¬ν•˜λŠ” 클래슀λ₯Ό 생성

ν΄λž˜μŠ€λŠ” 처음 객체λ₯Ό 생성할 λ•Œ μ΄ˆκΉƒκ°’μ„ μƒμ„±ν•˜κ³ , multiply() ν•¨μˆ˜λ₯Ό λΆ€λ₯Ό λ•Œλ§ˆλ‹€ ‘μ΄ˆκΉƒκ°’ * number’의 값을 ν˜ΈμΆœν•˜λŠ” 클래슀 (κ³±μ…ˆ 클래슀)

>>> 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

맀우 λ³΅μž‘ν•œ 연산도 λ”°λ‘œ μ €μž₯ν•˜μ—¬ μ‚¬μš©ν•  λ•Œκ°€ 쑴재

μ΄λŸ¬ν•œ μ €μž₯ λͺ¨λ“ˆμ„ 효율적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ‹€μŒ μ½”λ“œμ²˜λŸΌ pickle λͺ¨λ“ˆμ„ μ‚¬μš©