카테고리 없음

파이썬 입문 4일차

또돌근 2021. 2. 9. 23:21
반응형

1) regular (정규식)

2) file (read / write / dir / 조회)

3) DB (sqlite / mariadb)

4) thread

 

 

-- 문자열[:n].isdigit() 숫자여부 / isalpha()문자여부 / islower()소문자여부 / isupper()대문자여부 / isspace()빈문자여부

-- join(무엇) 이어붙이기

-- import re / pattern 

-- compile(정규식) / .sub("이렇게", 무엇을)  바꿔 /

--  if pattern.search(무엇_for문변수)       무엇이 pattern에 만족

-- 정규식 그룹,  \g<n> ,   (?P<xxxxx>패턴)

-- open("파일이름", "읽/쓰기 모드", ["인코딩방식"_생략가능])

-- .readline()  /  close()      (while문에서)

-- .writelines()                      (while문에서)

-- os.path.isfile(무엇) / isdir(무엇) / exists(무엇) / .join(무엇,무엇)

-- import sqlite3 / db = "xxx.sqlite" / con=sqlite3.conect(db) / cur= con.cursor()

-- db설정/ db연결 / sql실행(결과저장) 객체

-- executescript(   sql   )

-- executemany(   sql   )

-- execute(   sql   )

-- commit()

-- cur.fetchall() / fetchone()       =>  list[(튜플, 튜플)]

-- sqlite는   ?    로 표시

-- mariadb는   %s    로 표시

-- for _ range(n, n)  :   _  표시는 따로 변수로 안받겠다는 것

-- join()

 

 

 

 

1. regular _1

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 09:43:14 2021

@author: 2016005

regularex1.py : 정규식 예제 1, 정규화 모듈 사용 안함
"""

data = '''
    park 800905-1234567
    kim 700905-1234567
    choi 850101-a123456
    '''
result = []


for line in data.split("\n"): #line : park 800905-1234567 (\n으로 나눈 것임)
    word_result = []
    
    for word in line.split(" "): #word : park   800905-1234567(공백으로나눠서 for문 돌림)[0][1]
        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit(): ##숫자니?
            word = word[:6] + "-"+"*******"
        word_result.append(word)  ##
        
    result.append(" ".join(word_result))
    #join : list의 요소를 연결.   (공백으로 연결을 해)
    
print("\n".join(result))


#######문자열에서 문자의 종류관련 함수#######
instr="123"
instr="a123"
if instr.isdigit() : ## 문자열로 입력했어도 내용이 숫자면 isdigit()가 숫자를 판별해줌.
    print(instr,": 숫자입니다")

if instr.isalpha(): ## 문자인지
    print(instr,":문자")

if instr.isalnum(): ## 문자+숫자 판별
    print(instr,":문자+숫자")

if instr.islower():
    print(instr,": 소문자") ## 숫자가 섞여있어도 문자는 소문자만 있어야

if instr.isupper():
    print(instr,": 대문자") ## 문자는 대문자만 있어야
    
if instr.isspace():
    print(instr,": 공백")

2. regular _2

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 10:03:57 2021

@author: 2016005

regularex2.py : 정규식 예제2. 정규화 모듈 사용하기
"""

import re 
## re : 정규식을 위한 파이썬의 모듈


##'''은 주석이 아니고 여러줄데이터
data = '''
    park 8000905-1234567
    kim 700905-1234567
    choi 850101-a123456
    '''
    
#()그룹   \d{6,7}숫자6자리또는7자리ok   [-]하이픈    \d{7}숫자7자리
pat = re.compile("(\d{6,7})[-]\d{7}")  #패턴에 만족하는 놈을 찾고

print(pat.sub("\g<1>-*******",data))  # 만족한 놈들을 바꿔
##   첫번째그룹은 그대로 두고, 하이픈 뒤에는 ********로 바꿔.
## 정규식의 패턴 조건에 맞는 데이터만 sub로 치환을 해주는 것.

"""
    park 800905-*******
    kim 700905-*******
    choi 850101-a123456
"""

"""
    정규식 표현법
    
    1. ( ) : 그룹화
    2. [ ] : 그냥 문자
    3. {n} : 개수
                => ca{2}t : a문자가 2개
                    "ct"   : false
                    "cat"  : false
                    "caat" : true
                    "caaat": false
       {n,m} : n개 이상 m개 이하
                => ca{2,5}t : a문자가 2~5개
                "ct"    : false
                "cat"   : false
                "caat"  : true
                "caaat" : true
                "caaaaaaaaaat":false
       
    4. \d  : 숫자
    5. \g<n> : ()로 그룹을 지었을 때, n째 그룹 의미(<1>는 첫번째 그룹)
    6. ?   : 0 또는 1개 (있거나 없거나)  
                => ca?t : a라는 문자가 없거나 1개인 경우
                        => "ct" : true다.
                        => "cat" : true다.
                        => "caaat" : false다.
    7. *   : 0개 이상
                => ca*t : a 문자가 0개이상.
                        => "ct" : true다.
                        => "cat" : true다.
                        => "caaat" : true다.
                        
    8. +   : 1개 이상
                => ca+t : a 문자가 1개이상.
                        => "ct" : false다.
                        => "cat" : true다.
                        => "caaat" : true다.
    
"""

3. regular _3

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 10:33:54 2021

@author: 2016005

regularex3.py : 정규식 예제
"""

import re

str = "The quick brown fox jumps over the lazy dog Te Thhe Thhhe."
str_list = str.split() ## split()에 아무것도 지정안하면 공백기준 나누기.
print(str_list)

pattern = re.compile("Th*e")
# [1)앞이 T로 시작하고, 2)h의 개수가 0개 이상이고, 3)끝이 e로 끝나는] 문자열 패턴설정
count = 0
for word in str_list :        # str_list 순회 중
    if pattern.search(word) : # 설정한 패턴의 조건에 만족하면? .search
        count += 1            # count 증가
print(" 결과1==> {1:s}:{0:d} ".format(count, "개수"))


pattern = re.compile("Th*e", re.I)
# re.I  :  ignorecase 대소문자 구분없이
count = 0
for word in str_list :        # str_list 순회 중
    if pattern.search(word) : # 설정한 패턴의 조건에 만족하면? (.search)
        count += 1            # count 증가
print(" 결과2==> {1:s}:{0:d} ".format(count, "개수"))
'''
 결과1==> 개수:4 
 결과2==> 개수:5 
 결과3==> The,the,Te,Thhe,Thhhe.,
 결과4==> The,the,Te,Thhe,Thhhe,
'''
#결과2에 맞는 문자열 출력하기
print(" 결과3==> ", end="")
for word in str_list :        # str_list 순회 중
    if pattern.search(word) : # 설정한 패턴에 맞는 문자열?
        print(word, end=",")       ##문제가 있다. 끝에 . 까지 찍혀나옴.
print()

#### "(?P<match_word>Th*e)" : Th*e 패턴에 match_word라는 이름을 준 것.을 그룹화 시킨것.에 대소문자구분 ㄴㄴ
pattern = re.compile("(?P<match_word>Th*e)", re.I)
print(" 결과4==>", end=" ")
for word in str_list :        # str_list 순회 중
    if pattern.search(word) : # 설정한 패턴의 조건에 만족하면? .search
        print("{0}".format(pattern.search(word).group("match_word")), end=",")
        ##그룹의 이름이 match_word 그룹에 속한 문자열들만 화면에 출력해줘.
print()


###pattern.sub : 값을 치환
# Th*e 패턴에 맞는 문장을 "a" 로 치환하기
###  pat.sub("\g<1>-*******",data)
pattern = re.compile("Th*e")

print("결과5: {0}".format(pattern.sub("a",str)))  
## format : 이 안에 있는(pattern.sub("a",str) 값을 {0}에다 집어넣어
print("결과5:", pattern.sub("a",str))

4. file _1 읽기

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 11:05:32 2021

@author: 2016005

fileex1.py  :  파일 읽기
"""

infp = None
inStr = ""
'''
    1) open("파일이름","파일모드(읽)","인코딩방식_생략가능") : 
    2) 파일모드
        "r" : 읽기모드 (쓰기 금지) == fileInputStream // reader
        "w" : 쓰기모드 (파일 없을시 자동생성, 파일존재시 내용변경) == fileOutputStream filewriter
        "a" : 쓰기모드, append모드. (파일 없을시 자동생성. 파일 존재시 내용추가.) filewriter, fileoutputstream+appendmode=true
        -----------
        "t" : 텍스트모드(fileReader), 문자형 모드. t는 기본형. 아무짓도 안하면 text모드다.
        "b" : 이진모드(binaryMode) 이미지 등 == fileoutputstream,fileinputstream
        
        wt fileoutputstream
        
        
infp : regularex3.py 텍스트 문서를 UTF-8로 읽기 위한 변수
'''

infp = open("regularex3.py", "rt", encoding='UTF8')
while True: #언제끝날지 모르니.
    inStr = infp.readline() #text모드이므로 한줄씩 읽음. 한줄을 읽어서 inStr변수에 저장(문자열형태)
    if inStr == None or inStr =="": #EOF : End Of File 이면 break==더 이상 읽을게 없으면
        break
    print(inStr, end="")  ##end=""를 붙인 이유 : 안붙이면 뉴라인 이 어저고저저고 돼서 한칸씩 더 띈다.
infp.close()

5. file_2 쓰기

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 11:31:49 2021

@author: 2016005

fileex2.py : 파일 쓰기
"""

outfp = None
outfp = open("data.txt", "w", encoding='utf8')
#             파일이름    모드          인코딩방식

while True:
    outStr = input("내용입력")
    if outStr != "" :
        outfp.writelines(outStr + "\n")
        
    else:
        break
outfp.close()
print("프로그램 종료")

6. file _3

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 11:38:03 2021

@author: 2016005

파일 관리 필요
파일 존재 여부 검증

fileex3.py : 파일 존재 여부 확인하기
"""

import os.path    ## 파일의 정보 관련 모듈 

#file = 'C:\\Data\\Python\\nofile.txt' #절대경로
file = "0209/regularex3.py" #현재 폴더 기준 상대경로
#file = "c:\\hadoophome"

#  ./ 집어넣으면 현재 폴더 의미
# ../ 부모폴더 의미

if os.path.isfile(file):                  # file이 '파일'이니?
    print("yes. it is a file")
elif os.path.isdir(file):                 # file이 '폴더'니?
    print("yes. it is a directory")
    
if os.path.exists(file):                  # file이 존재하니?
    print("Something exist")
else :
    print("Nothing")
    
print(os.path.basename(file)) # 이름


#자바에서는 IOStream을 이용해야하고
#파이썬에서는 open을 쓰고, 정보읽는데에는 os.path를 이용
# 절대경로, 상대경로 가능

7. file _4

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 11:50:37 2021

@author: 2016005

fileex4.py : 모듈을 이용하여 폴더 조회하기

"""

import os.path

print("폴더 목록 보기 : os.walk 모듈 사용")

for dirName, subDirList, fnames in os.walk("c:\\intel"):  #하위폴더속의 파일까지도 가져옴.
    for fname in fnames:
        print(os.path.join(dirName, fname))
    print(type(subDirList))
    print(subDirList)
    
    
'''
** os.walk
리턴값 : 리스트형태, 튜플형태, 이터레이터형태

결과값을 dirName(폴더이름) subDirList(폴더의 하위목록) fnames(파일이름들)
         
폴더이름과 파일 이름을 연결해서 화면에 출력
=> c:\hadoophom\파일이름


'''

8. DB _1 sqlite

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 12:00:51 2021

@author: 2016005

dbex1.py : sqlite db 사용하기

    sqlite : 파이썬 내부에 존재하는 dbms
    
    (자바는 자바내부에 db가 있는게 아니다. 외부에서 다른 데이터베이스와 설정,연동하는 방식임)
    (파이썬은 자체적으로 db를 가지고 있다. sqlite, 안드로이드에도 존재함. sqlite는 휴대용, 가벼운 dbms)
"""
import sqlite3
'''

'''
dbpath = "text.sqlite"  # 데이터베이스 파일 이름설정
conn = sqlite3.connect(dbpath)  # DB파일이 생김
cur = conn.cursor()  # sql구문을 실행하기 위한 객체하나 만듦. '커서'
cur.executescript(   #sql구문 들(;) 실행. 문장 여러개.; 로 구분. 하나만 실행은 executescript
                  #자동 item_id 증가
    '''
        drop table if exists items;
        create table items (item_id integer primary key, name text unique, price integer);        
        insert into items (name, price) values ('Apple', 800);
        insert into items (name, price) values ('Orange', 500);
        insert into items (name, price) values ('Banana', 300);
    
    '''
    )
conn.commit()  #트랜잭션을 종료해 : 실제 물리적으로 데이터를 저장.(반대 rollback)

cur = conn.cursor()  # 다시 sql구문을 실행하기 위한 객체.
cur.execute("select * from items")  #문장 한 개 실행--execute

item_list = cur.fetchall()    #cur.fetchall() : 모든 레코드를 몽땅 다 가져와=>list로 전달

print(type(item_list))

#1)
for it in item_list:
    print(it)     #it 의 type = tuple 변경불가 list
    print(type(it))
  
#2)
for item_id, name, price in item_list:  # 파이썬은 이렇게도 제공이 된다.
    print(item_id,name,price)

#3)
for it in item_list:
    print(it[0], it[1], it[2])

9. DB _2 sqlite

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 13:42:09 2021

@author: 2016005

dbex2.py : sqlite db 예제
"""

import sqlite3

con, cur = None, None
data1, data2, data3, data4 = "","","",""
con = sqlite3.connect("iddb") # db와 연결 객체
cur = con.cursor() # db에서 sql구문 실행 객체
cur.executescript(     #테이블이 존재하면 삭제(drop table if exists usertable); / 
    '''
        drop table if exists usertable;        
        create table usertable (id char(4) primary key, username char(15), email char(15), birthyear int);
    '''
    )
while True:
    data1 = input("사용자 ID=> ")
    if data1 == "" :
        break
    data2 = input("사용자 이름 => ")
    data3 = input("이메일 => ")
    data4 = input("출생년도 => ")
    
    #작은따옴표로 문자열 표시(char)
    sql = "insert into usertable values('"\
        + data1 + "','"+data2+"','"+data3+"',"+data4+")"
    cur.execute(sql)
    con.commit()    #커밋 하고.
    
con.close()

10. DB _3 sqlite

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 14:04:49 2021

@author: 2016005

dbex3.py : usertable의 내용을 화면에 출력하기
"""
import sqlite3

con, cur = None, None
row = None
con = sqlite3.connect("iddb")
cur = con.cursor()

cur.execute("select * from usertable") 
item_list = cur.fetchall()   # 몽땅
for it in item_list:
    print(it)
print()

#cur.execute("select * from usertable")  
##fetch는 일회용이다. 그래서 한번 fetch***를 썼으면 cur.execute를 한번 더 해줘야한다.

while True:
    row= cur.fetchone()  #한개의 레코드만 조회
    if row == None:  # row 는 tuple, 하나만 가져오니까 두개째에는 None이 된다.
        break
    print("%5s %15s %15s %d" % (row[0],row[1],row[2],row[3]))
con.close()

11. DB _4 sqlite

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 14:34:03 2021

@author: 2016005

dbex4.py : usertable에 데이터 추가하기

개별데이터가 아닌 한꺼번에 묶어서 등록
"""
import sqlite3

data = [('test6','테스트2','test2@aaa.bbb',1990),
        ('test7','테스트3','test3@aaa.bbb',1991),
        ('test8','테스트4','test4@aaa.bbb',1992),
        ('test9','테스트5','test5@aaa.bbb',1993)]
#data의 자료형 : 리스트. but, 안에 들어가있는 내용들은 tuple이다. 
#꺼내올때도 tuple로 꺼내오니까 넣어줄때도 tuple을 list로 묶어서 넣어주는 것.

con = sqlite3.connect("iddb")  #이게 바로 dbms다.
cur = con.cursor()
cur.executemany("insert into usertable (id, username, email, birthyear) values(?,?,?,?)", data)
con.commit()

#executemany()  :  레코드를 여러건 동시에 insert할거야.

#execute() 한건
#executescript() 여러건
#executemany() 튜플을 이용해서 한번에 여러건

cur.execute("select * from usertable")
item_list = cur.fetchall()
for it in item_list :
    print(it)
print()

con.close()

#sqlite가 간편하고 좋을지 모르지만, 파이썬으로만 접근이 가능하고, 여러모로 사용하기에 불편할 수 있다.
#그래서 sqlite는 복잡하지않고, 단순한 데이터들 등록에 사용하는게 대부분.
#대표적으로 종료할 때 현재 상태를 저장한다던가(위치 등)에 쓴다.
#일반적으로 사용하기엔 부족함이 없지 않다.

12. DB _5 mariadb

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 14:53:29 2021

@author: 2016005

dbex5.py : mariadb
"""

import pymysql
'''
======================================================================
이 모듈은 원래 없음. 외부모듈 설치 필요. 
↑ pip3 install pymysql 실행하기 
(자바에서는 jar파일 갖다붙이고, 메이븐 프로젝트에서 가지고옴. 파이썬에서는 모듈 실행을 해야한다.)

만약 오라클이라면 오라클용으로 설정을 해야한다.

****anaconda prompt실행 => cmd창에 pip3 install pymysql 을 쳐넣기. ****
install하면 내부 저장소에 얘가 해당모듈을 등록해주고, 필요할때 갖다 쓰면 된다.

(base) C:\****\*******>pip3 install pymysql
     Collecting pymysql
     Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
     |████████████████████████████████| 43 kB 278 kB/s
     Installing collected packages: pymysql
     Successfully installed pymysql-1.0.2

(base) C:\****\*******>
=========================================================================
'''

conn = pymysql.connect(host="localhost", port=xxxx,
                       user="xxxxxx", passwd="xxxxxx",
                       db="xxxxxx", charset="utf8")
try :
    cur = conn.cursor()
    cur.execute("select * from item")
    for row in cur.fetchall():
        print(type(row), row)
finally: #except 가 없이 finally만 있다. ==> 혹시나 오류가 있더라도 다 닫고 가.
    cur.close()
    conn.close()

13. DB _6 mariadb

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 15:31:29 2021

@author: 2016005

dbex6.py : mariadb와 연결하기
한꺼번에 말고 한줄씩 집어넣기

sqlite에서는 autoincrement 없어도 되는데
mariadb에서는 필요함.

"""

import pymysql #pip3 install pymysql

conn = pymysql.connect(host="localhost", port=xxxx,
                       user="xxxxxx", passwd="xxxxxx",
                       db="xxxxxx", charset="utf8")
cur = conn.cursor()
cur.execute("drop table items")  
    #sqlite경우는 if가 있으니까 테이블이 있으면 그냥 처리할 수 있는데, 
    #mariadb는 여기서 에러나서 프로그램이 종료될 것이다. 있으면 삭제하도록.

cur.execute(
    '''
    create table items
    (item_id integer primary key auto_increment, name varchar(300), price integer)
    '''
    )
#sqlite의 특징은 자동으로 하나씩 증가시켜줌. mariadb는 설정해줘야됨.

data = [("바나나",3000),("망고",30000),("사과",10000)]

for i in data :
    cur.execute("insert into items (name,price) value(%s,%s)",i) 
    #mariadb에서는 %s 를 사용.
    #sqlite에서는 ? 를 사용.
    
conn.commit()

cur.execute("select * from items")
for row in cur.fetchall():
    print(row)
    
#items 테이블에서 가격에 3,000이상 10,000이하 레코드 조회
print("#items 테이블에서 가격에 3,000이상 10,000이하 레코드 조회")
cur.execute("select * from items where price between %s and %s",(3000,10000)) #두개라서 튜플로설정
           #"select * from items where price >= %s and price <= %s", (3000,10000)
  ###  %s 인데 문자열이냐? 숫자임. mariadb이면 %s로 접근해야한다. 모듈에 따라 달라지는 것.###
for row in cur.fetchall():
    print(row)
    
    
#items 테이블에서 가격이 30000인 레코드를 제거하기
print("#items 테이블에서 가격이 30000인 레코드를 제거하기")
cur.execute("delete from items where price=%s",30000) #한개만 있으니 그냥 30000
conn.commit() #commit을 하지 않으면 트랜잭션 처리가 안됨. db수정이 안됨.

cur.execute("select * from items")
for row in cur.fetchall():
    print(row)
    
    
    
cur.close()
conn.close()
# 이 두개가 없으면 더 이상 움직이지 않음. lock을 걸어버린 것. 
## db와 연결이 계속 돼있어서, 두 번째에 들어가려면 못들어가는 것. 연결종료 시켜줘야 안전함.
#(자바의 경우 자체적으로 객체를 몽땅 없애버리기 때문에 close가 자동인데, 파이썬에서는 수동임)

14. thread

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 16:14:50 2021

@author: 2016005

threadex1.py : 스레드 예제

파이썬에서도 스레드를 쓸 수 있다.
"""

import threading
import time   # 시간관련 모듈. 스레드를 잠시 대기상태로 보낼 수 있는 기능 모듈.

class RacingCar:
    
    carName = ""
    
    def __init__(self,name):
        self.carName = name;
    
    def runCar(self):
        for _ in range(0,3): # _ (언더바)  : 안쓰겠다는 것. 그냥 0~2까지.
            carStr = self.carName+"달립니다\n"
            print(carStr,end="")
            time.sleep(0.1) # 밀리초 아니다. 0.1초임.

car1 = RacingCar("자동차1")
car2 = RacingCar("자동차2")
car3 = RacingCar("자동차3")

th1 = threading.Thread(target=car1.runCar) # 자바에서는 러너블인터페이스 구현해서 run메서드를 실행했다면
th2 = threading.Thread(target=car2.runCar) # 파이썬에서는 car1안에 있는 runCar를 실행
th3 = threading.Thread(target=car3.runCar) # threading을 통해서 메서드를 지정하고, start()를.

th1.start()
th2.start()
th3.start()

th1.join()  #th1 스레드가 종료돼야 main이 종료하도록.
th2.join()
th3.join()

print("main 종료")

'''
자동차1달립니다
자동차2달립니다
자동차3달립니다
main 종료              #먼저 종료됨(스레드다.)
자동차1달립니다
자동차2달립니다
자동차3달립니다
자동차1달립니다
자동차2달립니다
자동차3달립니다
'''

===========test================

1. test_1 sql

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 16:46:08 2021

@author: 2016005

1. 콘솔에 sql 구문을 입력하면 mariadb의 테이블들을 이용하여
 결과를 출력할 수 있도록 프로그램 작성하기
   [결과]
sql 구문을 입력하세요 : select * from student
.....
.....


"""

import pymysql

instr = input("sql 구문 입력 : ")

conn = pymysql.connect(host="localhost", port=xxxx,
                       user="xxxxxx", passwd="xxxxxx",
                       db="xxxxxx", charset="utf8")
cur = conn.cursor()
cur.execute(instr)          # 쿼리문을 execute한 결과를 cur이 가지고 있음.
for row in cur.fetchall():  # cur에서 fetchall() 한것을 row가 받아서
    print(row)              # row를 print함.

cur.close()
conn.close()

2. test _2 thread

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 16:53:26 2021

@author: 2016005

2. Thread를 이용하여 
1~10000까지의 합을 5개의 스레드로 나눠서 각각의 구간 합을 
스레드 1 : 1 ~ 2000까지의 합
스레드 2 : 2001 ~ 4000까지의 합
스레드 3 : 4001 ~ 6000까지의 합
스레드 4 : 6001 ~ 8000까지의 합
스레드 5 : 8001 ~ 10000까지의 합
main에서 더하여 총합을 구하는 프로그램 작성하기
"""

import threading
import time

class calc:
    total = 0
    num1 = 0
    num2 = 0
    name = ""
    
    def __init__(self, num, name):
        self.num1 = num
        self.num2 = num+2000
        self.name = name
        
    def calNum(self):
        print(self.name,"실행중")
        sum = 0
        for i in range(self.num1, self.num2):
            sum+=i
        calc.total += sum
        time.sleep(0.1)
        #return sum
    def calNum2(self):
        sum = 0
        for i in range(self.num1, self.num2):
            sum+=i
        return sum
        
c1 = calc(1, "c1")
c2 = calc(2001, "c2")
c3 = calc(4001, "c3")
c4 = calc(6001, "c4")
c5 = calc(8001, "c5")


th1 = threading.Thread(target=c1.calNum())
th2 = threading.Thread(target=c2.calNum())
th3 = threading.Thread(target=c3.calNum())
th4 = threading.Thread(target=c4.calNum())
th5 = threading.Thread(target=c5.calNum())


th1.start()
th2.start()
th3.start()
th4.start()
th5.start()

th1.join() 
th2.join()
th3.join()
th4.join()
th5.join()

print("main에서 c1.calNum2()+....호출:",
      c1.calNum2()+c2.calNum2()+c3.calNum2()+c4.calNum2()+c5.calNum2())
print("클래스변수로 더하기 calc.total:",calc.total)
print("main 종료")

3. test _3 file input output

# -*- coding: utf-8 -*-
"""
Created on Tue Feb  9 17:41:15 2021

@author: 2016005

3. 파일 명을 입력받아 파일을 복사하는 프로그램 작성하기

[결과]
원본파일의 이름을 입력하세요: test1.py
복사본파일의 이름을 입력하세요 : test1.bak

복사완료
"""
import os.path

infile = input("원본파일의 이름을 입력 : ")
outfile = input("복사본파일의 이름을 입력 : ")

infp = None
outfp = None

infp = open(infile, "rt", encoding='UTF8')
outfp = open(outfile, "w", encoding='utf8')

inStr = ""

while True:
    inStr = infp.readline() 
    if inStr == None or inStr =="": #EOF
        break
    print(inStr, end="")
    
    outStr = inStr
    if outStr != "":
        outfp.writelines(outStr)
    else:
        break
    
infp.close()
outfp.close()

print("복사완료")
반응형