코딩배우기

파이썬 코딩 3 유틸리티

오미자컴 2023. 8. 21. 01:09

VS Code로 코딩하려면 어떻게 하나요?
구글 검색 : vs code
Download for Windows Stable Build 단추 클릭.
다운로드 폴더에서 VSCodeUserSetup-x64-1.81.1 파일을 실행합니다.
동의 합니다. 선택 후 다음. 설치 위치 선택 창에서 다음. 시작 메뉴 폴더 선택 창에서 다음. 추가 작업 선택 창에서 ‘바탕 화면에 바로가기 만들기’ 선택 후 다음. 설치 단추 클릭. 설치 후 종료 단추 클릭
‘언어 팩을 설치하여 표시 언어를 한국어로 변경합니다’ 알림 창에서 ‘설치 및 다시 시작’
실행 후 시작 탭에서 ‘폴더 열기’ 메뉴 클릭. 다운로드 폴더에 Vstest 폴더를 만들고 ‘폴더 선택’
‘이 폴더에 있는 파일의 작성자를 신뢰합니까’ 창에서 ‘부모 폴더’ 체크 후 ‘예, 작성자를 신뢰합니다’
시작 탭에서 ‘새 파일’ 메뉴 클릭. 열린 입력 창에 test.py 입력 후 엔터. 열린 창에서 ‘파일 생성’.
‘Python 언어에 대한 권장되는 Microsoft의 ‘Python’ 확장을 설치하시겠습니까?’를 묻는 알림 창에서 ‘설치’
창 왼쪽 아래 [관리(톱니 바퀴 아이콘) – 설정(Ctrl+,)]. Editor : Font Size – 20. Editor : Word Wrap – on.
에디터 창 오른쪽 위에 삼각형 모양의 실행(재생) 아이콘이 안 보이면, 왼쪽 창에서 ‘실행 및 디버그’ 클릭 후 다시 ‘실행 및 디버그’  단추 누르고 파이썬 선택.

천자문을 하루에 16자씩 공부하는 코딩을 하려면 어떻게 하나요?
한 줄에 4자씩 작업한 c1000.txt 파일을 유니코드 형식으로 불러와 c1000 리스트에 하나씩 넣습니다.
제일 처음에 공부할 때 숫자 1을 입력하여 날짜 파일 myDate.txt와 인덱스 파일 myIndex.txt를 만듭니다. 언제든 공부를 시작할 때 숫자 1을 입력하면 기존의 파일 내용이 삭제되고 처음부터 다시 작성됩니다.
Study 함수를 만들어 오늘 공부, 어제 공부, 지난주 공부를 할 수 있도록 합니다.
날짜 파일 myDate.txt를 불러와 myDate 리스트에 한 줄씩 넣습니다. 그리고 오늘 데이터도 하나 넣습니다.
마찬가지로 인덱스 파일 myIndex.txt를 불러와 myIndex 리스트에 한 줄씩 넣습니다.
이렇게 작성한 myDate 리스트와 myIndex 리스트는 리스트의 길이를 반환하는 len() 함수를 활용하여 어제 공부와, 지난주 공부를 할 수 있는 기준으로 활용합니다.
오늘 공부 후에 myDate.txt 파일과 myIndex.txt 파일에 데이터를 기록합니다. 공부 이력을 기록하는 것입니다.
myDate의 길이가 1보다 크면 어제 공부를 하도록 합니다. 또 myDate의 길이가 5보다 크면 지난주 공부를 하도록 합니다.

한 줄에 4자씩 작업한 c1000.txt 파일을 유니코드 형식으로 불러와 c1000 리스트에 하나씩 넣으려면 어떻게 하나요?
영단어 공부 코딩처럼 for 문을 통해 한 줄씩 불러옵니다.
# -*- coding: utf-8 -*-
c1000 = []
result_f = open("c1000.txt", encoding='UTF8')
for line in result_f:
    c1000.append(line)
result_f.close()
유니코드로 불러오려면 encoding=‘UTF8’ 인수를 줘야 합니다.

숫자 1을 입력하여 날짜 파일 myDate.txt와 인덱스 파일 myIndex.txt를 만들려면 어떻게 하나요?
Input 함수를 통해 숫자를 입력할 수 있게 합니다.
g = input('제일 처음부터 공부하려면 숫자 1을 치세요~ 이어서 공부하려면 그냥 엔터~')
파일들을 ‘쓰기’ 옵션으로 엽니다. 이렇게 하면 만약 파일이 없으면 새로 만들고, 기존에 데이터가 있던 것을 다 삭제됩니다. 그래서 파일을 초기화 하는 용도로도 사용합니다.
if g == '1':
    f = open('myDate.txt','w')
    f.close()
    a = open('myIndex.txt','w')
    a.close()

Study 함수를 어떻게 만드나요?
우선 인수로 ment와 number를 넣고 오늘 공부, 어제 공부, 지난주 공부 등을 출력합니다.
def study(ment,number):
    print(f'{ment} ' + '공부~')
공부할 한자 리스트를 출력하기 위해 필요한 연산을 합니다. 4줄을 반복하여 출력합니다.
    count = 0
    for i in range(4):
        myStdNum = (count + len(myIndex) + len(myDate)) – number
        print(c1000[myStdNum])
        input('엔터를 치세요~')
        count += 1
4번 번복하려고, for i in range(4):
카운트 숫자를 증가하여 그 다음 줄을 리스트에서 출력합니다.
count = 0
myStdNum = (count + len(myIndex) + len(myDate)) – number
count += 1

 

오늘 공부할 한자 리스트를 출력하기 위해 필요한 연산을 어떻게 하나요?
제일 첫 줄을 출력하려면, myStdNum이 0이 되어야 합니다. (Count 0 + len(myIndex) 0 + len(myDate) 1) – number 1이 되어야 합니다. myIndex엔 아직 아무런 데이터도 없으므로 0, myDate 리스트에 1을 추가했으므로 1, number는 함수 인수로 넘어온 수.
오늘 공부 함수를 사용하려면?
study('오늘',1)

myDate 리스트와 myIndex 리스트를 어떻게 만드나요?
해당 파일을 불러와 한 줄씩 리스트에 추가합니다.
myDate = []
result_myDate = open("myDate.txt")
for line in result_myDate:
    myDate.append(line)
result_myDate.close()
myDate.append(1)
myIndex = []
result_myIndex = open("myIndex.txt")
for line in result_myIndex:
    myIndex.append(line)
result_myIndex.close()
오늘 날짜 데이터를 리스트에 추가해야 하므로, myDate.append(1)
이렇게 파일에서 데이터를 가져와 리스트에 추가하면 공부한 이력을 저장하는 것입니다. 이를 기준으로 어제 공부한 위치로 갈 수 있고, 지난주 공부한 위치로도 갈 수 있습니다.

오늘 공부 후에 myDate.txt 파일과 myIndex.txt 파일에 데이터를 어떻게 기록하나요?
‘추가’ 옵션으로 파일을 열고 데이터를 추가합니다.
dateWrite = open('myDate.txt', 'a')
dateWrite.write('1 \n')
dateWrite.close()
indexWrite = open('myIndex.txt', 'a')
indexWrite.write('1 \n')
indexWrite.write('2 \n')
indexWrite.write('3 \n')
indexWrite.close()
날짜 데이터는 숫자 1을 하나 입력하고 줄빠꿈 기호를 넣어줍니다.
이 날자 데이터 하나에 인덱스 데이터 셋을 더하여 총 4개를 공부할 총 줄 수로 정하는 것입니다. 따라서 인덱스 데이터를 3개를 추가합니다. 편의상 1, 2, 3으로 하였습니다.

myDate의 길이가 1보다 크면 어제 공부를 하도록 합니다. 또 myDate의 길이가 5보다 크면 지난주 공부를 하도록 하려면 어떻게 하나요?
If 문을 통해 myDate의 길이가 1보다 크면 어제 공부 함수를 실행하고, myDate의 길이가 5보다 크면 어제 공부 함수를 실행하도록 합니다.
if len(myDate) > 1:
    study('어제', 5)
if len(myDate) > 5:
    study('지난주', 21)
어제 공부의 number 인수는 왜 5인가요?
처음부터 공부했다고 가정하고 둘째 날이면, 어제 공부는 다시 첫 줄이니까 0번째 리스트를 출력해야 합니다. (카운트 0 + 날짜 길이 2 + 인덱스 3) – 5를 해야 답이 0이 나오므로, number 인수를 5로 한 것입니다.
첫 날에서 그 다음주가 되어, 지난주 공부를 하려면 날짜는 6(여섯 째 날)이 되어야 합니다. 1주에 5번 공부하는 것으로 한 것입니다. 그러면 인덱스는 둘째 날 3이므로 여섯 째 날은 3 X 5이므로 15입니다. (카운트 0 + 날짜 길이 6 + 인덱스 15) – 21를 해야 답이 0이 나오므로, number 인수를 21로 한 것입니다.

겹치고 반복되는 코딩이 있는데 이를 함수로 만들려면 어떻게 하나요?
겹치고 반복되는 내용이 아닌 것을 인수로 처리합니다.
myDate = []
myIndex = []

def c1000List(cFile, cName):
    result_cName = open(cFile)
    for line in result_cName:
        cName.append(line)
    result_cName.close()

c1000List("myDate.txt", myDate)
myDate.append(1)
c1000List("myIndex.txt", myIndex)

def c1000Write(cWriteFile, cData):
    cWrite = open(cWriteFile,'a')
    cWrite.write(cData)
    cWrite.close()

c1000Write('myDate.txt','1 \n')
c1000Write('myIndex.txt','1 \n')
c1000Write('myIndex.txt','2 \n')
c1000Write('myIndex.txt','3 \n')

 

QR코드를 만드는 코딩을 어떻게 하나요?
우선 qrcode와 pillow를 설치합니다(구름IDE에선 pillow를 설치하지 않아도 됩니다). qrcode 라이브러리를 가져옵니다. Pillow 모듈은 qrcode의 이미지처리에 필요합니다.
인터넷 주소를 한 줄씩 작성한 텍스트 파일을 불러와 한 줄씩 리스트에 저장합니다.
한 줄씩 qr코드로 만들고 이를 이미지 파일로 저장합니다. 

QR코드란 뭔가요?
문자를 네모난 모양으로 배치합니다. 한글의 경우 약 1700자를 저장할 수 있습니다.
주로 인터넷 주소(URL)를 qr코드 이미지로 만들어 이를 스캔하면 해당 주소로 접속하도록 할 때 많이 사용합니다.


URL 주소가 있는 파일을 불러와 한 줄 한 줄 QR 코드 이미지로 만들려면 어떻게 하나요?
우선 qrcode 라이브러리를 불러옵니다.
Import qrcode
With키워드로 텍스트 파일을 열고, For 문을 사용하여 텍스트 파일을 한 줄씩 읽어 들여 리스트에 저장합니다.
with open('urls.txt', 'r') as f: 
# ‘r’은 urls.txt를 읽기 모드로 엽니다.
    for url in f:
url 주소에서 줄바꿈 기호(\n)를 제거합니다
        url = url.strip()
URL 주소를 QR 코드로 생성합니다.
        qr = qrcode.make(url)
URL 주소에서 www와 com 등을 제거합니다.
        site_name = url.replace('https://', '').replace('www.', '').replace('.com', '').replace('.net', '')
QR 코드를 이미지로 저장합니다.
        qr.save(f'{site_name}.png')


텍스트 파일을 음성 파일로 저장하고 읽어주려면 어떻게 하나요?
구글의 TTS 라이브러리를 이용합니다.
구글의 TTS 라이브러리는 텍스트를 음성으로 읽어줍니다.
Playsound 라이브러리를 이용해 음성 파일을 재생합니다. 이 라이브러리는 내 PC 환경에서 가능하고, 구름 IDE에서는 이 부분 빼고, mp3 파일만 저장합니다.
텍스트 파일을 열어 텍스트 모드로 읽어 들여 변수에 저장합니다.
텍스트를 읽어 들인 변수를 음성 파일로 저장하고 재생합니다.

구글의 TTS와 playsound 라이브러리를 가져오려면 어떻게 하나요?
먼저 터미널 창에서
pip install gtts
pip install playsound(구름 IDE에선 제외)
코딩 창에서
from gtts import gTTS
from playsound import playsound
import os
왜 os 라이브러리도 가져오나요?
Playsound를 현재 경로에서 실행할 때 필요합니다.

Playsound를 현재 경로에서 실행하려면 어떻게 하나요?
우선 현재 경로로 이동합니다.
os.chdir(os.path.dirname(os.path.abspath(__file__)))
Playsound 함수를 통해 mp3 파일을 재생합니다.
playsound("myPoem1.mp3")

텍스트 파일을 열어 텍스트 모드로 읽어 들여 변수에 저장하려면 어떻게 하나요?
우선 텍스트 파일을 UTF8 인코딩으로 열어 f 변수에 할당하고, 이를 read 함수로 읽어 들여 readFile 변수에 바인딩합니다.
with open('poem1.txt', encoding='UTF8') as f :
    readFile = f.read() 
With 키워드를 사용하면 파일을 열고 나서 다시 닫지 않아도 알아서 처리해 주어 편리합니다.

텍스트를 읽어 들인 변수를 음성 파일로 저장하려면 어떻게 하나요?
우선 gTTS함수를 사용하여 텍스트를 음성으로 변환하여 tts 변수에 할당합니다.
tts = gTTS(text=readFile, lang='ko')
텍스트를 지정하고, 언어를 한국어로 정해줍니다.
Save함수를 통해 mp3 파일로 저장합니다.
tts.save("myPoem1.mp3")

 

내 컴퓨터의 정보를 알아보려면 어떻게 하나요?
우선 platform, socket 라이브러리를 불러옵니다.
그리고 psutil을 설치하고 가져와 활용합니다.
platform 라이브러리의 함수로 컴퓨터 이름, 운영체제, CPU 정보 등을 알아냅니다.
socket 라이브러리를 통해 IP 주소를 얻습니다.
psutil 라이브러리의 함수들을 활용하여 다음과 같은 정보를 가져옵니다.
cpu_freq() 함수로 cpu 속도를 알아봅니다.
cpu_count() 함수로 cpu 개수를 알아봅니다.
virtual_memory() 함수로 메모리 크기를 알아봅니다.
net_io_counters() 함수로 네트워크 보내고 받는 데이터 크기를 알아봅니다.
disk_partitions() 함수로 디스크 크기 등을 알아봅니다.

platform 라이브러리의 함수로 컴퓨터 이름, 운영체제, CPU 정보 등을 알아보려면 어떻게 하나요?
컴퓨터 이름에 대한 정보를 가져오려면 node 함수를 사용합니다.
Computer_name = platform.node()
운영 체제 이름을 얻으려면 system 함수, 운영 체제 버전을 알려면 release 함수를 씁니다.
os_name = platform.system()
os_release = platform.release()
CPU 정보를 얻으려면 processor 함수를 사용합니다.
Processor = platform.processor()
IP 주소를 알려면 socket 라이브러리의 gethostbyname 함수와 gethostname 함수를 사용합니다.
Ip_address = socket.gethostbyname(socket.gethostname())

print(f"컴퓨터 이름: {computer_name}")
print(f"운영체제: {os_name} {os_release}")
print(f"CPU 정보: {processor}")
print(f"IP 주소: {ip_address}")

cpu_freq() 함수로 cpu 주파수(속도)를 알아보려면 어떻게 하나요?
import psutil
my_cpu = psutil.cpu_freq()
cpu_freq_current = round(my_cpu.current / 1000, 2) 
Current 속성은 뭔가요?
현재 cpu 속도입니다.
current가 메가 헤르츠로 출력되므로, 이를 1000으로 나누면 기가 헤르츠.
소수점 2자리까지 반올림
print(f"cpu 주파수: {cpu_freq_current}GHz")

 

cpu_count() 함수로 cpu 개수를 알아보려면 어떻게 하나요?
cpu_core = psutil.cpu_count(logical=False)

print(f"코어: {cpu_core} 개"  )
물리적인 개수만 표시합니다.

virtual_memory() 함수로 메모리 크기를 알아보려면 어떻게 하나요?
my_memory = psutil.virtual_memory()
print(f'메모리 크기: {round(my_memory/(1024**3))}GB')
3제곱
1024는 키로바이트, 1024를 두 번 곱하면(제곱) 메가바이트, 3제곱은 기가.

net_io_counters() 함수로 네트워크 보내고 받는 데이터 크기를 알아보려면 어떻게 하나요?
my_net_io = psutil.net_io_counters()
sent = round(my_net_io.bytes_sent/1024**2, 1) 
# 소수점 이하 한 자리까지
recieved = round(my_net_io.bytes_recv/1024**2, 1)
print(f'네트워크 보내는 양: {sent}MB   네트워크 받는 양: {recieved}MB')

disk_partitions() 함수로 디스크 크기 등을 알아보려면 어떻게 하나요?
my_disk = psutil.disk_partitions() 
이 함수는 리스트를 반환합니다.
print(my_disk[0].mountpoint, my_disk[0].fstype, end=' ')
my_disk_usage = psutil.disk_usage(my_disk[0].mountpoint)
print(f'하드디스크: {round(my_disk_usage.total / 1024**3)}GB' )
Mountpoint 속성은?
디스크 문자나 경로를 표시합니다.
Fstype 속성은?
디스크의 파일시스템을 표시합니다.
Print 함수에서 end=‘ ’ 옵션은?
Print 함수 출력문들 사이는 기본적으로 한 칸을 띄어쓰기 합니다. 그리고 기본적으로 줄바꿈을 하도록 되어 있는데, 이를 없애는 옵션이 end입니다. end=‘ ’ 이렇게 하면 한 칸 띄어쓰기를 하고 그 다음 print 문을 같은 줄에 출력합니다.

 

ip 주소 등을 알아보려면 어떻게 하나요?

우선 psutil을 설치하고 가져와 활용합니다.
Socket 라이브러리와 psutil 라이브러리를 가져와 활용합니다.
Psutil 라이브러리의 net_if_addrs() 함수를 통해 랜카드 정보를 가져옵니다.
getNicInfo 함수를 만들고, 인수로 랜카드 이름이 eth0인 것의 정보를 차례차례 가져와 그 중에 AddressFamily.AF_INET의 정보 중 ip 주소, 넷마스크 주소, 브로드캐스트 주소 등을 출력하도록 합니다.
소켓?
네트워크를 통해 데이터를 주고 받는 창구 역할
AddressFamily.AF_INET는? 
소켓이 통신할 때 필요한 주소 유형입니다. 통신의 안전을 위해, 보통 소켓에서 정한 패밀리끼리만 서로 통신할 수 있도록 했습니다. 그리고 이 주소 유형은 인터넷이 만들어질 때 처음부터 사용하던 유형입니다. 더 발전한 유형은 AF_INET6입니다.
Ip 주소?
컴퓨터에 부여된 네트워크 주소
넷마스크 주소?
서브넷 마스크라고 하는데, 네트워크를 나누어 구분하고자 할 때 사용하는 주소
브로드캐스트 주소?
네트워크 모두에 데이터 보낼 수 있는 주소

Psutil 라이브러리의 net_if_addrs() 함수를 통해 랜카드 정보를 가져오려면 어떻게 하나요?
우선 라이브러리를 가져오고 getNicInfo 함수를 만들고, 인수로 랜카드 이름이 eth0인 것의 정보를 차례차례 가져와 그 중에 AddressFamily.AF_INET의 정보 중 ip 주소, 넷마스크 주소, 브로드캐스트 주소 등을 출력하도록 합니다.

import socket
import psutil

def getNicInfo(nicName=''):
    addrs = psutil.net_if_addrs()
    if nicName in addrs:
        for nicInfo in addrs[nicName]:
            if nicInfo.family == ocket.AddressFamily.AF_INET:
                print(f'IP 주소 : {nicInfo.address}  넷마스크 주소 : {nicInfo.netmask}  브로드캐스트 주소 : {nicInfo.broadcast}')

getNicInfo(nicName="eth0")

psutil.net_if_addrs()는 무슨 함수인가요?
랜카드 정보를 딕셔너니 형태로 보여주는 함수입니다.
key가 랜카드 이름이고 값이 랜카드에 할당된 주소를 딕셔너리로 출력해줍니다. 이때 값을 튜플로 묶은 리스트로 출력합니다. a = { 'a': [1,2,3]}
키와 값을 튜플로 묶을 때 다음과 같이 합니다.
family : address family
address : 기본 랜카드 주소
netmask : netmask 주소
broadcast : broadcast 주소
ptp : 포인트 투 포인트 주소(일반적으로 VPN)
참고 : 튜플 – 한 쌍의 목록, 예) 무지개. 괄호로 묶음. 딕셔너리 – 키 = 값 형태를 집합 기호로 묶음. 리스트 – 대괄호로 묶음.

VPN이란 뭔가요?
VPN(가상 사설망)은 인터넷을 통해 안전하고 암호화된 연결을 제공하는 기술입니다. 공용 또는 보안되지 않은 네트워크를 사용하는 경우에도 사설 네트워크를 사용하는 것처럼 인터넷에 액세스할 수 있습니다.
VPN을 사용하면 모든 인터넷 트래픽이 암호화된 터널을 통해 라우팅되어 해커나 인터넷 서비스 공급자와 같은 다른 사람이 온라인 활동을 모니터링하거나 가로채는 것을 방지합니다. 따라서 공용 Wi-Fi를 사용하거나 원격 위치에서 인터넷에 연결할 때 VPN이 특히 유용합니다.
VPN을 사용하면 사용자 위치에서 차단되거나 제한될 수 있는 웹사이트 및 온라인 서비스에 액세스할 수 있습니다. 예를 들어 인터넷 검열이 엄격한 국가를 여행하는 경우 VPN을 사용하여 다른 방법으로는 사용할 수 없는 콘텐츠에 액세스할 수 있습니다.
요약하면 VPN은 인터넷을 통해 안전하고 암호화된 연결을 제공하고 온라인 개인 정보 및 보안을 보호하여 전 세계 어디에서나 원하는 콘텐츠에 액세스할 수 있도록 합니다.

for nicInfo in addrs[nicName]:는 무슨 뜻인가요?
랜카드 정보 중에서 eth0의 리스트를 하나씩 nickInfo 변수에 가져옵니다.

if nicInfo.family == socket.AddressFamily.AF_INET:는 무슨 뜻인가요?
"nicInfo" 객체의 "family" 속성이 "socket.AddressFamily.AF_INET"과 같은지 확인합니다.
Python의 "소켓" 모듈은 기본 네트워크 서비스에 액세스하는 방법을 제공합니다. "socket" 모듈의 "AddressFamily" 열거는 네트워크 주소의 주소 형식을 지정하는 데 사용됩니다. 이 경우 "AF_INET"은 "Address Family Internet"을 나타내며 IP 버전 4 주소를 나타내는 데 사용됩니다.
조건문은 "nicInfo.family" 속성이 IP 버전 4 주소를 나타내는지 확인하고, 그렇다면 "if" 블록 내에 들여쓰기된 코드가 실행됩니다. "nicInfo.family" 속성이 IP 버전 4 주소를 나타내지 않는 경우 "if" 블록 내의 코드는 건너뜁니다.
즉, 이 조건문은 "nicInfo" 개체가 나타내는 네트워크 주소가 IP 버전 4 주소인지 확인하는 데 사용되며, 그렇다면 "if" 블록 내의 코드가 해당 특정 네트워크 주소에 대해 실행됩니다.