본문 바로가기

Challenge/SK 뉴스쿨 정보보안과 3기

SK 뉴스쿨 프로그래밍 기초 파이썬 (2022.04.05)

728x90
반응형

 

 

4/05 수업 정리 (python)

 

 

 

자료형

 

숫자, 문자열 등 자료 형태로 사용하는 모든 것을 지칭.

타입(Type)이라고도 하며, 변수나 값의 자료형을 알아보려면 type() 메서드를 사용

 

 


 

자료형 실습 코드

num1 = 1234
num2 = 3.14
num3 = 5.5 + 3.1j
string1 = 'test'
tuple1 = (1, 2, 3, 4)
list1 = [1, 2, 3, 4]
dict1 = {1: "One", 2: "Two", 3: "Three", 4: "Four"}
bool1 = True

print(f"{num1} =", type(num1))
print(f"{num2} =", type(num2))
print(f"{num3} =", type(num3))
print(f"{string1} =", type(string1))
print(f"{tuple1} =", type(tuple1))
print(f"{list1} =", type(list1))
print(f"{dict1} =", type(dict1))
print(f"{bool1} =", type(bool1))

 

 

 


 

 

숫자형

 

 

숫자로 이루어진 자료형. 2진수는 0b, 8진수는 0o, 16진수는 0x로 표현

 

 

 


 

 

문자열 연산 실습 코드

My = "My"
Program = "Program"
Line = "=" * 10

print(Line)
print(f"{My} "+f"{Program}")
print(Line)

 

 

 

문자열 슬라이싱 실습 코드

a = '2022040514:09'
year = a[:4]
month = a[4:6]
day = a[6:8]
time = a[8:]

print(f"{year}년 {month}월 {day}일 시각: {time}")

 

 

 

replace, split, join 함수 실습 코드

# 문자열 바꾸기 replace()
apple = "Apple is delicious"
banana = apple.replace("Apple", "Banana")

print(banana)

# 문자열 나누기 split()
string1 = "Apple is delicious"
string2 = "a:b:c:d"

result1 = string1.split()
result2 = string2.split(":")

print(result1)
print(result2)

print("".join(result2))

 

 

list 실습 코드

list1 = list()
print(type(list1), list1)

list2 = []
print(type(list2), list2)

list3 = [1, 2, 3, 4, 5]
print(type(list3), list3)

list4 = [1]
print(type(list4), list4)

list5 = [1, 2, 3, 1.1, 2.2, 'A', True, (1,2,3)]
print(type(list5), list5)

 

 

딕셔너리의 키 값을 변경할 때는 update 메서드를 사용한다.

 

 

집합(Set)

순서에 상관없이 중복을 제거하는 자료형 따라서 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용한다.

 

 

 


 

 

제어문

 

제어문의 맨 끝에 콜론(:) 반드시 기재

 

 

 

 

조건문

 

특정 조건의 참, 거짓 여부를 판단해서 코드 실행 여부 결정

 

 

 

if 실습 코드

a = 1
if a == 1:
    print("조건이 참이므로 실행합니다.")
if a == 2:
    print("조건이 거짓이므로 실행되지 않습니다.")

 

 

if 실습 코드2

a = 50
if a < 60:
    print(f"{a}점이므로 불합격입니다.")
else:
    print(f"{a}점이므로 합격입니다.")

a = 80
if a < 60:
    print(f"{a}점이므로 불합격입니다.")
else:
    print(f"{a}점이므로 합격입니다.")

 

 

 

if 실습 코드3

num = 2
if num < 0:
    print(f'{num}은 음수입니다.')
elif num > 0:
    print(f'{num}은 양수입니다.')
else:
    print(f'{num}은 0입니다.')

 

 

 


과제 :

/etc/passwd|-rw-r--r--|644|root|0|root|0 해당 문자열을 "|"를 기준으로 나누어 아래와 같은 포맷으로 kisec.txt 파일에 쓰시오.

kisec.txt 파일 안에 /etc/passwd|-rw-r--r--|644|root|0|root|0 이 문자열을 가공 후 추가 삽입

파일명 : /etc/passwd [ 권한 = -rw-r--r--(644), 소유자 = root(0), 소유그룹 = root(0) ]

 

 


 

1. kisec.txt 파일을 만들기

 

 

2. 파일이 잘 열리는 지 with 함수와 readlines 함수로 테스트

with open("./kisec.txt", "r") as f:
    print(f.readlines())

 

결과:

 

 

3. readlines 함수를 f_text라는 변수에 적용하여 기존에 작성된 문자들을 문자열 형태로 만들기

f_text = str(f.readlines())

 

 

4. f_input 변수를 만들어 a 옵션으로 open함수 실행하기

f_input = open("./kisec.txt", "a", encoding="UTF-8")

 

 

5. data라는 변수에 f_text 변수에 담긴 문자열을 “|” 기준으로 나눠주기

data = f_text.split("|")

 

 

6. 나뉜 문자열들을 조건에 맞게 각각 replace 함수를 이용해서 작성해주고 str_data라는 변수에 한꺼번에 합치기

first_data = data[0].replace("[\'", "파일명 : ") + " "
second_data = "[ 권한 = " + data[1] + "(" + data[2] + "), "
third_data = "소유자 = " + data[3] + "(" + data[4] + "), "
forth_data = "소유그룹 = " + data[5] + "(" + data[6].replace("\']", ") ]")
str_data = "\n" + first_data + second_data + third_data + forth_data

 

 

7. write 함수를 이용해 str_data 변수를 텍스트 파일에 추가해주고, 마지막으로 close 함수로 open 함수의 실행을 종료시킨다.

f_input.write(str_data)

f_input.close()

 

 

전체코드

with open("./kisec.txt", "r") as f:
    f_text = str(f.readlines())

f_input = open("./kisec.txt", "a", encoding="UTF-8")
data = f_text.split("|")
first_data = data[0].replace("[\'", "파일명 : ") + " "
second_data = "[ 권한 = " + data[1] + "(" + data[2] + "), "
third_data = "소유자 = " + data[3] + "(" + data[4] + "), "
forth_data = "소유그룹 = " + data[5] + "(" + data[6].replace("\']", ") ]")
str_data = "\n" + first_data + second_data + third_data + forth_data
f_input.write(str_data)

f_input.close()

 

 

결과:

 

 


 

 

하지만 위의 방식은 매우 그리디한 방식으로 효율적으로 보이지 않는다. 따라서 다음과 같이 코드를 수정해보았다.

 

with open("./kisec.txt", "r", encoding="UTF-8") as f:
    f_text = f.readlines()[0].split("|")

f_input = open("./kisec.txt", "a", encoding="UTF-8")
f_input.write(f"\n파일명 : {f_text[0]} [ 권한 = {f_text[1]}({f_text[2]}), 소유자 = {f_text[3]}({f_text[4]}), 소유그룹 = {f_text[5]}({f_text[6]}) ]")

f_input.close()

 

 

결과:

 

 

728x90
반응형