반응형

**파이썬의 자료형

1.Data 의 분류 방법

1)수정 가능 여부

=>변경 가능(mutable) - 변수

=>변경 불가능(immutable) - 상수

=>Literal: 사용자가 직접 입력한 데이터

정수: 10

실수: 10.3

bool: True, False

복소수: 정수 +(-) 정수j

 

문자열: '문자열', "문자열", '''문자열''', """문자열"""

list: [데이터 나열]

tuple:(데이터 나열)

set: {데이터 나열}

dict:{key:data, key:data...}

 

데이터 없음:None

 

=>변수의 생성 및 수정 과 삭제

이름 = Literal, 연산식, 함수 등

영역 내에서 이름이 처음 등장하면 생성

영역 내에서 이름이 처음이 아니면 수정

영역은 동일한 들여쓰기이면 같은 영역

 

변수는 영역이 종료되면 소멸됩니다.

del(변수)를 이용해서 강제로 종료하는 것도 가능

 

2)데이터가 가리키고 있는 개수에 따른 분류

=>scala data: 1개의 데이터 - 분석의 대상이 아닙니다.

=>vector data: 0개 이상의 데이터 - 분석의 대상

=>scala data는 정수, 실수, 복소수, bool, 문자열(scala data가 되기도 하고 vector data),날짜

=>vector data는 문자열, list(array 라고도 합니다.), tuple, set, dict

 

3)형태에 따른 분류

=>정형 데이터: 테이블로 바로 변환이 가능한 데이터 - 관계형 데이터베이스에 존재 - 기술통계

=>비정형 데이터: 테이블로 바로 변환이 되지 않는 문자열이나 이미지 및 음성 데이터 같은 것들로

머신런닝을 적용할 때는 숫자로 변환해서 사용(이러한 작업을 인코딩 이라고 합니다.) - 거리

=>반정형 데이터: 초기 상태는 비정형 데이터처럼 보이지만 가공을 하면 정형 데이터로 변환할 수 있는 데이터로 json 이나 xml 데이터 등 - web 이나 기기로부터 직접 가져온 데이터

 

2.bool

=>True False 1개만 저장하는 자료형

=>0이 아닌 숫자나 None 이 아닌 집단 자료형의 데이터들도 True로 간주하고 0이나 None인 집단 자료형의 데이터는 False로 간주

=>bool을 숫자와 산술연산을 하면 True 1로 간주하고 False 0으로 간주해서 연산

=>강제로 bool로 만들고자 하는 경우에는 bool(데이터)

 

 

#bool 덧셈
b = True
result = b + 2 #b 1로 간주해서 1+2 = 3
print(result)

 

 

3.int

=>정수 자료형

=>다른 자료형을 정수로 변환하고자 할 때는 int(데이터)

정수로 된 문자열이면 정수로 변환되고 실수로 만들어진 문자열이면 에러가 발생

실수를 대입하면 소수 버림

 

f = '10.7'

x = float(f)

n = int(x) # n 10

 

4.float

=>실수 자료형

=>실수는 표현 못하는 숫자가 있습니다.

부정확합니다.

=>실수로 변경하고자 할 때는 float(데이터)

=>데이터를 읽었을 때 문자열로 읽어진 경우 숫자로 변환해야 하는 경우가 많기 때문에 변환방법을 숙지

 

5.sequential type(데이터를 순서대로 저장하는 자료형)

=>str, bytes, list, tuple

1)인덱싱

데이터[인덱싱]: 인덱싱 번째 데이터가 리턴, 음수를 사용하면 뒤에서부터

 

2)슬라이싱

=>데이터[시작위치:종료다음위치:간격] : 시작위치부터 종료다음위치 앞까지 간격단위로 리턴

=>종료위치를 생략하면

=>끝까지 간격을 생략하면 1

 

3)연결하기: 동일한 자료형끼리 +를 하면 연결

 

4)반복하기: 정수와 *

 

5)데이터 개수: len(데이터)

 

6)존재 여부 확인: in 연산자

 

6.str(문자열)

=>한 줄 문자열은 작은 따옴표 나 큰 따옴표로 묶으면 됨

=>여러 줄 문자열은 작은 따옴표나 큰 따옴표 3번으로 묶으면 됨

=>문자열은 수정할 수 없습니다.

문자열은 인덱싱이나 슬라이싱으로 데이터를 읽는 것만 가능하지 대입하는 것은 안됩니다.

 

1)제어문자 : \다음에 하나의 문자를 입력해서 특수한 기능 부여

\n : 줄바꿈

\t :

\', \"

\\: \

      파이썬에서는 윈도우더라도 디렉토리 기호는 / 사용이 가능

 

2)format 메소드

=>데이터에 서식을 지정해서 문자열을 생성하는 메소드

=>서식은 "{데이터의 인덱스:서식}".format(데이터) 로 지정

=>데이터의 개수는 제한이 없습니다.

 

7.bytes

=>바이트 배열

=>네트워크 나 파일의 내용을 읽거나 전송할 때 사용

원래 네트워크나 파일의 전송단위는 byte

이 기종 간에 데이터를 주고받을 때는 byte 단위로 데이터를 전송한 후 복원합니다.

=>문자열을 bytes 로 만들 때는 b'문자열'

=>bytes를 문자열로 만들 때는 decode(byte 배열)

 

8.list

=>데이터를 순서대로 저장한 자료구조

=>내부 데이터를 읽고 쓰는 것이 가능

1)생성

=>[데이터 나열]

=>list(__iter__가 구현된 객체): list로 변환

 

2)list 에 연산을 수행해서 새로운 list 만들기

[연산식 for 임시변수 in list] : list의 데이터를 임시변수에 대입한 후 연산을 수행해서 새로운 list 생성

 

3)조건식을 적용해서 새로운 list 만들기

[연산식 for 임시변수 in list if 조건]

 

4)함수에 대입할 때는 [ ]를 붙이지 않습니다.

 

#list에 연산을 해서 새로운 list 만들기

li = [10, 4, 9, 23, 26]

#데이터를 순차적으로 접근

for imsi in li:

    print(imsi, end='\t')

print()

#li의 요소들을 k에 하나씩 대입해서 3을 곱해서 새로운 list 생성

print([k*3 for k in li])

#필터링 - 짝수만 골라내기 - 텍스트 마이닝에서 많이 사용하는 문법

print([k for k in li if k % 2 == 0])

#함수에 사용할 때는 []를 생략

print(sum(k for k in li if k % 2 == 0))

 

li = ['겨울', '', '']

print([k for k in li if len(k) > 1])

 

 

li = [10,20,30,40,50]

t = li[0:3:1] #슬라이싱 - 복제가 됩니다.

#슬라이싱 데이터와 원본 데이터는 다른 데이터

print(t)

t[0] = 1000 #복제된 데이터를 수정해도 원본 데이터에는 아무런 영향이 없음

print(li)

 

5)append, insert, delete, reverse, sort, count - 매개변수로 대입된 데이터의 개수를 구해주는 메소드

등을 소유

 

6)list 안에 list 생성 가능

=>2차원 list - 이미지나 문자열 데이터를 읽어서 변형하면 이 구조

 

[[데이터], [데이터]....]

 

=>이미지는 바로 numpy ndarray로 바로 변환해서 사용하기 때문에 2차원  list로 만드는 경우는 드물지만 알아는 두어야 합니다.

머신러닝은 순수한 데이터만 가지고 작업을 수행합니다.

 

국어 영어

10   20

30   70

 

=> 저 데이터를 아래처럼 변경해야만 머신러닝에서 사용 가능

10   20

30   70

 

안녕하세요 반갑습니다.

어서오세요 환영합니다.

=>위와 같은 문장을 단어 별로 분해를 해주세요..

 

[[안녕하세요, 반갑습니다.], [어서오세요, 환영하세요]]

 

#2차원 list 인 경우 접근

li = [[100, 300], [400, 200]]

 

#행단위 접근

for imsi in li:

    for temp in imsi:

        print(temp, end='\t')

    print()

print()

 

#열단위 접근 - numpy pandas에는 T 라는 속성을 이용해서 행과 열을 switch

for i in range(0, len(li), 1):

    for j in range(0, len(li[i]), 1):

        print(li[j][i])

 

7.tuple

=>내부 데이터를 수정할 수 없도록 하고 순서대로 배치하는 데이터의 모임

1)생성

(데이터 나열)

1개일 때는 (데이터,)

 

2)각가의 데이터는 인덱싱을 이용해서 접근

 

3)tuple의 데이터는 분할해서 변수에 저장 가능

변수1, 변수2... = 튜플

=>튜플의 값들을 순서대로 변수1, 변수2 에 대입

 

4)함수가 여러 개의 데이터를 리턴해야 할 때 각각의 데이터가 서로 다른 의미를 갖고 모여서 하나를 이루어야 하는 경우 파이썬은 class tuple을 이용

tuple의 데이터를 각각의 의미를 갖는 변수에 대입해서 사용하는 경우가 많습니다.

 

#회귀분석을 하게되면 결과로 기울기와 절편의 값을 리턴합니다.

result = (4, 7) #이 상태면 result[0] 이 기울기, result[1]이 절편

 

slope, intercept = result #0번 데이터가 slope 1번 데이터가 intercept에 대입

print('기울기:', slope)

print('절편:', intercept)

8.dict

=>key value를 같이 저장

1)생성

{key:data, key:data....}

=>data scala 데이터면 하나의 행(Serise)을 만드는 것입니다.

=>data list 이면 테이블(DataFrame)을 만드는 것입니다.

 

2)데이터 접근

dict[key] 를 이용해서 하나 하나의 데이터에 접근

없는 key를 사용하면 에러가 납니다.

파이썬의 매개변수를 만들 때 **args 이런 형태로 만들면 내부적으로 dict 가 됩니다.

우리가 대입할 때는 이름=, 이름=...

실수로 필수 입력 내용을 주지 않으면 에러가 발생합니다.

 

#Key Error : 없는 key를 사용

dictionary = {'name':'park', 'num':1}

print(dictionary['num'])

print(dictionary['age'])

 

3)2개의 list를 가지고 생성

zip(key list, data list)

 

 

 

반응형

'Study > Python' 카테고리의 다른 글

python-13  (0) 2020.10.26
python-12  (0) 2020.10.26
python-11  (0) 2020.10.26
python-10  (0) 2020.10.26
Python-9  (0) 2020.09.12
반응형

변수 < 함수< 클래스 < 파일(모듈) < 패키지

함수 부터를 모듈 프로그래밍 이라고 합니다.

 

 

**클래스

1.용어

1) class: 동일한 목적을 달성하기 위해 모인 변수와 함수의 집합

사용자 정의 자료형 : 사용자가 만드는 자료형

 

 

2)object:프로그래밍에서 사용되는 모든 것

 

3) class object: 클래스와 동일한 의미

 

4) instance : class를 기반으로 만들어진 객체

 

2. 파이썬에서 클래스 정의

class 클래스이름:

           코드 작성

 

3.method작성

=>method: class 안에 만들어진 함수

1)member method: 만들기는 클래스에 만들지만 실제 사용은 instance가 하는 메소드

=>.python에서느느 member method를 만들 때 매개변수가 반드시 1개 이상 있어야 합니다.

이 매개변수느느 instance자신의 참조가 대입됩니다.

이름은 관습적으로 self라고 합니다.

도움말을 확인할 때 첫번쨰 매개변수로 self가 있으면 이 메소드는 member method입니다.

 

instance가 반드시 있어야 합니다.

 

def 메소드이름(self [, 다른 매개변수르 선언]):

           메소드 수행 내용

 

2)member method호출

자신의 클래스 내부에서 호출 : self.메소드이름(매개변수) ->self에는 아무것도 대입하지 않습니다.

self에는 대입하면 안된다.

 

클래스 외부에서 호출 - 바운드 호출: 인스턴스이름.메소드이름(매개변수) ->self에는 아무것도 대입하지 않음

 

클래스 외부에서 호출 - 인바운드 호출: 클래스이름.메소드이름(인스턴스,매개변수) ->selfinstance를 대입해야 합니다.

 

 

3)클래스의 인스턴스

생성자(매개변수)

 

class Student:

    #member 메소드

    def func(self):

        print("member method")

 

obj = Student()

obj.func() #인스턴스가 호출 -권장

Student.func(obj)#클래스가 메소드를 호출

 

4.속성(field, attribute..)

=>객체 안에 데이터를 저장할 수 있는 변수

=>클래스 안에서 메소드 외부에 변수가 선언되면 클래스가 사용할 수 있고 인스턴스는 읽을 수만 있습니다.

인스턴스가 메소드 외부에 선언된 변수를 수정하게 되면 인스턴스 안에 변수를 만들어서 저장을 합니다.

 

=>메소드 안에서 만들어진 변수느 메소드 안에서만 사용이 가능한 지역변수가 됩니다.

=>메소드 안에서 변수를 만들 때 self.변수명을 사용하면 인스턴스가 별도로 소유하는 인스턴스 변수가 됩니다.

=>파이썬의 인스턴스는 속성을 추가 할 수 이있습니다.

인스턴스이름.속성명 = 데이터

이 속성이 존재하면 수정이고 없으면 추가해서 대입합니다.

class Student:

    #이 변수는 클래스와 인스턴스 모두 접근 가능하지만

    #인스턴스는 수정 못함

    schoolName ='중앙'

 

#메소드 바깥에 있는 변수는 클래스와 인스턴스 모두 호출 가능

print(Student.schoolName)

obj = Student()

print(obj.schoolName)

 

 

#클래스가 수정

Student.schoolName ='메가스터디'

print("수정한 후 출력")

print(Student.schoolName)

print(obj.schoolName)

 

 

obj.schoolName ='서울대학교'

print("인스턴스로 수정 한 후  출력")

print(Student.schoolName)

print(obj.schoolName)

그래서 클래스 만들 때 조심해야 한다 . 바깥에서 변수 만드는 경우는

 

class Student:

    #이 변수는 클래스와 인스턴스 모두 접근 가능하지만

    #인스턴스는 수정 못함

    schoolName ='중앙'

 

    def method(self):

        self.num =1 #인스턴스가 사용할 수 있는 변수 생성

        age = 20 #메소드 안에서만 사용할 수 있는 변수 생성

 

#메소드 바깥에 있는 변수는 클래스와 인스턴스 모두 호출 가능

print(Student.schoolName)

obj = Student()

print(obj.schoolName)

 

 

#클래스가 수정

Student.schoolName ='메가스터디'

print("수정한 후 출력")

print(Student.schoolName)

print(obj.schoolName)

 

 

obj.schoolName ='서울대학교'

print("인스턴스로 수정 한 후  출력")

print(Student.schoolName)

print(obj.schoolName)

 

 

#파이썬은 클래스에 없는 속성을 인스턴스에 추가 가능

obj.name = 'Park'

print(obj.name)#없는 이름 쓰면 계속 추가된다.

 

#method에서 self.num age를 생성

obj.method()

print(obj.num)# 인스턴스 변수가 호출 가능

print(obj.age)#age 는 지역변수라서 인스턴스가 호출 불가능

 

5. 특수 속성

=>파이썬이 용도를 정의해놓은 속성

=> __로 시작하고 __로 끝남

대표적인 속성이 __doc__ 로 함수에서 이 속성에 문자열을 대입하면 help로 확인이 가능합니다.

 

6.constructor(생성자)

=>__init__라는 이름으로 생성자를 만듭니다.

=>첫번째 매개변수는 self이고 이후에 매개변수 추가가 가능

만들지 않아도  self만 가진 생성자가 클래스에 자동으로 추가됩니다.

__init__(self)는 존재합니다.

 

=>새로 생성자를 추가하면 기본적으로 제공되는 생성자는 소멸됩니다.

=>생성자를 만드는 이유는 다른 메소드를 호출하지 않고 인스턴스 속성을 초기화하기 위해서 입니다.

=>생성자를 호출하는 방법은 클래스이름(메개변수) 형태로 하고 호출하면 메모리 할당을 한 후 그 메모리에 대한 참조를 리턴합니다.

 

여기서 name이 만들어진다.

 

class Student:

    #생성자 -매개변수 없이 호출하면  name =None매개변수를 대입하면 그값이 name에 대입

    def __init__(self,name =None):

        self.name = name

   

    def getName(self):

        return self.name

 

    def setName(self,name):

        self.name = name

 

obj = Student()

#setName을 호출하면 self.name이 만들어지기 때문에 문제가 안됨

obj.setName('park')

print(obj.getName())

 

obj1 = Student()

print(obj1.getName())#생성자가 없으면 setName을 호출하지 않았기 때문에 name이 없음

 

 

obj2= Student('Steve')

print(obj2.getName())

 

7. __del__

=>인스턴스가 파괴될 때 호출되는 메소드

=>self이외의 매개변수는 가질 수 없음

=>파이썬의 메모리 관리는 Reference count(참조 횟수 ) 방식

=>참조 횟수가 0이 되면 파괴됩니다.

=>인스턴스가 변수에 대입되면 참조 횟수는 1증가

def(변수명)을 호추하거나 None을 대입하면 참조 횟수가 1 감소

=>참조 횟수를 확인하고자 하는 경우는 sys모듈의 getrecount라는 함수에 인스턴스를 대입하면 됩니다.

import sys

class Temp:

    #소멸자

    def __del__(self):

        print('인스턴스가 파괴됩니다.')

 

#생성자를 호출해서 인스턴스를 생성 한 후 t에 대입 - 참조 횟수 1

t = Temp()

#인스턴스를 다른 곳에 대입하면 참조횟수가 1 증가 합니다.

k = t

 

print(sys.getrefcount(k))

 

#변수에 None을 대입 - 참조 횟수가 1줄어듬

t = None

 

del(k) #변수를 삭제합니다. - 참조 횟수가 1 줄어듬

#데이터 횟수가 맞아야 한다.

 

 

 

 

8. 정적 메소드 :클래스가 호출하는 메소드

1)static메소드

메소드 위에 @staticmethod라고 기재하고 매개변수를 만들 때 self를 만들지 않습니다.

self가 없어집니다.

 

2)class메소드

메소드 위에 @classmethod라고 기재하고 첫번째 매개변수는 클래스 자신이 대입된느 cls를 추가

cls->자기 클래스

 

9. __slots__ 속성

=> 이 속성에 list로 문자열을 대입하면 문자열에 해당하는 속성만 사용 가능

class DTO:

    def __init__(self, num = 0, name=None):

        self.num = num

        self.name = name

    #name num이외의 속성은 만들 수 없도록 제한하기

    __slots__ = ['name','num']

 

dto = DTO(1,'park')

dto.tel ='01037900199'

 

 

10.property

=>객체 지향 프로그래밍에서는 인스턴스가 변수를 직접 사용하는 것을 권장하지 않습니다.

gettersetter를 이용해서 접근하는 것을 권장

=>파이썬에서는 인스턴스 변수를 만들 때 __를 앞에 붙이면 인스턴스가 변수에 접근을 못합니다.

=>property(fget=None,fset = None, fdel =None, doc=None)함수를 이용해서 gettersetter메소드를 지정할 수 있습니다.

변수를 사용하는 것처럼 사용하지만 실제로는 property에 설정된 메소드를 호출합니다.

class DTO:

    def __init__(self,name = None):

        #private처럼 클래스 외부에서는 __name에 접근할 수 없습니다.

        self.__name = name

 

    def getName(self):

        print('getter')

        return self.__name

    def setName(self,name):

        print('setter')

        self.__name = name

    #.name을 호출하면 getName이 호출되고 .name= 값 을 호출하면 setName이 호출

    name = property(fget=getName, fset=setName)

 

dto = DTO('park')

#print(dto.__name)

dto.name = 'kkk'

print(dto.name)

 

 

11.연산자 오버로딩

=>연산자의 기능을 변경하는 것

=>__add__(self,other)이 메소드를 만들면 이 클래스의 인스턴스들은 +연산을 할 수 있음

그 이외에도 sub(-), mul(*)을 재정의 하면 다른 연산자도 사용 가능

=>dir(인스턴스나 클래스)로 사용할 수 있는 메소드를 확인해서 어떤 연산이 가능한지 확인을 할 필요가 있습니다.

 

li1 = [100,300]

#print(dir(li1))

 

li2 = [30,70]

print(li1+li2) #__add__가 있어서 더하기 가능

print(li1 > li2) #__gt__가 있어서 > 가능

 

#날짜는 - 가 있고 +는 없다.

#__str__ =>tostring하고 같은 기능이다.

 

 

 

12.상속

class 클래스이름(클래스 이름 나열):

=>파이썬은 다중 상속이 되서 여러 개의 클래스로 부터 상속 가능

다중 상속은 별로 안좋다.이름이 동일하면 오류 난다.

하지만 파이썬은 여러 클래스에 동일한 이름의 속성이나 메소드가 있으면 앞에 작성한 클래스의 것을 상속받습니다.

 

**파이썬과 R의 차이

R:분석만 가능 - 최근에는 프로그램을 만드는 것도 가능하지만 불편합니다.

python : 범용 프로그램잉 언어 - 분석을 쉽게 할 수 있는 라이브러리가 제공 분석도 가능

 

단순하게 분석을 해서 보기만 할 거라면 R이 좋지만 결과물을 생성할려고 하면 python이 우세합니다.

 

r은 가공을 잘 못하는데 파이썬은 가공을 잘 한다.그러면 클래스의 객체지향 문법을 알아야 한다.

 

 

 

반응형

'Study > Python' 카테고리의 다른 글

Python-14  (0) 2020.11.03
python-12  (0) 2020.10.26
python-11  (0) 2020.10.26
python-10  (0) 2020.10.26
Python-9  (0) 2020.09.12
반응형

**함수

1.매개변수가 있는 함수

=>매개변수가 있는 경우 매개변수의 이름만 나열 하면 됩니다.

 

=>매개변수가 있는 함수를 호출할 때는 기본적으로 매개변수를 전부 대입해서 호출해야 합니다.

 

=>매개변수는 순서대로 대입해야 하는데 매개변수 이름과 함꼐 대입하면 순서를 변경해서 대입해도 됩니다.

대다수의 경우 첫번째 매개변수는 핵심이 되는 매개변수일 가능성이 높기 때문에 이름없이 대입하고 두번째 매개변수부터 이름과 함께 대입합니다.

 

#data cnt 만큼 출력하는 함수

def disp(data,cnt):

    for i in range(0,cnt,1):

        print(data)

 

#함수 호출 -매개변수 2개를 순서대로 대입해서 호출

disp('python',3)

 

1)    매개변수를 적게 대입해서 발생하는 예외 : TypeError: disp() missing 1 required positional argument: 'cnt'

2)    매개변수의 자료형이 잘못 된 경우 TypeError: 'str' object cannot be interpreted as an integer

 

데이터 분석할 경우 햇갈리는 것:

numpy array : 값만 있는 것->머신런닝

pandasdataframe  : 통계 시각화 컬럼이름과 데이터

                       예를 들면 평균시 어떤 평균인지 알아야 한다.

둘다 2차원 배열 이다.

 

#disp('python') #매개변수 개수가 부족해서 예외

#disp(3,'python') #자료형 예외

 

#매개변수의 순서를 변경해서 대입

disp(cnt = 3, data = 'Java')

 

=>매개변수에 기본값 부여 가능

매개변수를 만들 때 = 기본값을 설정해주면 됩니다.

기본값이 있는 매개변수는 생략하고 호출이 가능

기본값이 있는 매개변수 뒤에 기본값이 없는 매개변수는 올 수 없습니다

 

=>매개변수 앞에 *을 붙이면 데이터를 몇 개를 대입하던지 이 매개변수가 전부 받습니다.

함수 내에서는 tuple 로 취급합니다.

이 매개변수는 반드시 마지막에 설정되어야 합니다.

 

=>매개변수 앞에 **을 붙이면 dict가 됩니다.

이 매개변수에 데이터를 대입할 때는 key = value형식으로 대입해야 합니다.

**이 붙는 매개변수를 가진 함수를 사용할 때는 document를 잘 읽어보고 사용해야 합니다.

그래프를 그리는 함수들이 이 형태의 매개변수를 가지고 있는 경우가 많습니다.

적절한 옵션들을 찾아서 사용해야 합니다.

#cnt에 기본값이 1이설정된 함수:

#cnt를 생략하면 1

def display(data,cnt=1):

    for i in range(0,cnt,1):

        print(data)

 

display('c++')

 

#sum함수의 도큐먼트 확인

help(sum)

start0이다.

 

#max함수의 도큐먼트 확인

help(max)

몇개를 주던 가장 큰값을 준다.

 

#max함수의 도큐먼트 확인

#help(max) #max 3번째 매개변수는 *이 붙어서 몇개를 대입해도 됩니다

print(max(20,10,40,50))

print(max(20,10,40,50,89,87))

 

# **이 붙은 매개변수는 key = value형태로 여러 개 대입이 가능

def createurl(server, port, file, **param):

    querystring =''

    for key in param:

        querystring = querystring+key +'=' +param[key] +'&'

 

    url = server +':' +port +'/' +file+'?' +querystring

    print(url)

createurl('211.183.6.60' ,'9000' ,'index.html',id='ggangpae1',pw='1234')

 

2. return

=>함수의 수행을 종료하고 호출한 곳으로 돌아가는 명령어

=>return 할 때 데이터르ㄹ 같이 가지고 갈 수 있습니다.

return뒤에 가지고 갈 데이터를 입력하면 데이터를 가지고 돌아값니다.

기본적으로 return1개만 가능합니다.

2개 이상 리턴하고자 하는 경우에는 (튜플),[리스트],{Set이나 DICE} 형태고 묶거나 나중에 나오은 CLASS, INSTANCE를 만들어서 리턴해야 합니다.

=>파이썬은 튜플의 경우는 변수에 나누어서 저장이 가능합니다.

변수나열 = (튜플)

튜플의 데이터를 순서대로 변수에 대입합니다.

변수의 개수와 튜플의 데이터가 개수가 다른 경우에는 마지막 변수에 튜플의 모든 데이터를 대입합니다.

 

python은 튜플 혹은 dict로 많이 준다. 쪼개서 하면 된다.

 

def reg(data):

    slope = 3

    intercept = 7

    #결과를 tuple로 리턴

    return (slope, intercept)

r = reg(10)

#튜플을 한꺼번에 저장

print(r)

print(type(r))#자료형을 확인 하기

#튜플을 나누어서 저장

slope, intercept = reg(10)

print('slope', slope)

print('intercept', intercept)

 

항상 매개변수는 뭐 잇을 가 확인

dir , help, type 등 자주 사용하기

 

3, 재귀함수(recursion)

=>함수가 함수르 호출하는 구조라서 느리고 메모리 사용량도 많지만 코드를 간결하게 만들 수 있는 장점이 있습니다.

 

피보나치 수열

1,1,2,3,5,8,13,...

첫번째와 두번째는 무조건 1

세번쨰 부터는 앞 2개의 합

 

def fibonacci(n):

    if n == 1 or n ==2:

        return 1

    else:

        return fibonacci(n-1) + fibonacci(n-2)

 

print(fibonacci(9))

 

하노이의 탑을 연습하기

감독관 배정

 

4.파이썬에서 함수는 일급 객체

=> 함수를 변수에 저장할 수 있고 리턴할 수 있고 매개변수로 대입할 수 도 있습니다.

함수가 일급 객체 안되는 것이 java 이다.

변수에 저장할 수도 있어니깐 매개변수에 저장할 수 도 있다

=>함수형 프로그래밍을 사용할 때와 closure를 만들기 위해서 사용합니다.

=>함수형 프로그래밍은 데이터의 모임(list,tuple, set, dict)에 하나의 함수를 적용하는 프로그래밍

=>closure는 함수가 함수를 리턴해서 함수 내부의 데이터를 함수 외부에서 변경하도록 하는 프로그래밍

 

5.람다(lambda)

=>파이썬에서는 이름없는 한 줄 짜리 함수

lambda매개변수 나열: 리턴할 내용

def addint(x,y):

    return x+y

 

#위의 함수를 람다 식으로 표현

lambdaadd = lambda x, y : x+y

print(lambdaadd(100,200))

 

 

=>람다 함수도 매개변수의 초기화 가능

=>한줄 짜리 함수라서 변수 선언은 안됩니다.

 

6.함수형 프로그래밍

=>데이터의 모임에 함수를 전부 적용하는 프로그래밍

1)map

=>데이터의 모임과 함수를 매개변수로 받아서 데이터의 모임에 함수를 전부 적용해서 결과를 데이터의 모임으로 리턴해주는 함수

=>대입된느 함수는 1개의 매개변수를 가져야 하고 반드시 데이터를 리턴해야 합니다.

numpy가 이행태로 연산한다.

 

 

#반복문을 사용할 경우

2020-02-18 19:18:05.056642

2020-02-18 19:18:05.068582

 

2020-02-18 19:18:45.946949

2020-02-18 19:18:45.962906

 

#함수형 프로그램의 맵을 사용할 경우

2020-02-18 19:20:24.933999

2020-02-18 19:20:24.937989

 

#10000개의 데이터에 1씩 더한 결과롤 list를 만들기

 

#반복문을 이용한 방법

def inc(x):

    return x+1

 

collection = [i for i in range(0,100000,1)]

 

import datetime

print(datetime.datetime.now())

result = []

for i in collection:

    #result.append(i+1)

    result.append(inc(i))

print(datetime.datetime.now())

 

print()

#함수형 프로그래밍을 이용ㅇ한 방법

print(datetime.datetime.now())

result = list(map(inc,collection))

print(datetime.datetime.now())

 

 

 

2)filter

=>데이터의 모임에서 함수의 수행결과가 true인 데이터만 모아서 리턴해주는 함수

=>대입되는 함수는 매개변수를 1개 받아서 bool을 리턴하는 함수이어야 합니다.

def odd(x):

    return x % 2 == 1

 

li =[10,30,21,32, 29]

print(list(filter(odd, li)))

 

3)reduce

=>데이터의 모임과 함수를 가지고 누적 연산을 수행해서 결과를 리턴하는 함수

=>결과가 1

=>대입되는 함수는 매개변수가 2개이고 결과를 리턴하는 함수이어야 합니ㅏㄷ.

매개변수는 처음에는 첫번째와 두번째를 데이터를 가지고 수행을 하고 그 다음부터는 앞 연산의 결과를 가지고 다음 데이터와 연산

앞의 값으로 계산

count하는 것  개수 새는 것

=>python에서는 reduce가 내장함수에서 빠지고 functools패키지의 함수로 변경

 

 

 

 

7,pass

=>클래스나 함수의 내용을 작성하고자 할 때 사용하는 예약어

=>내용이 없는 함수나 클래스를 만들 때 사용합니다.

def addint(x,y):

    return x+y

#reduce는 누적 연산을 해서 결과를 리턴하는 함수

import functools

print(functools.reduce(addint, li))

 

 

8.__doc__

=>함수 내부에 __doc__속성에 문자열을 대입하면 help(함수) 했을 때 출력이 됩니다.

=>파이썬이나R에서 함수를 만들어서 배포하고자 할 때 이 속성에 이 함수의 기능을 설명을 해야 합니다.

배포할 때는 한글로 사용하면 안된다.

 

 

 

 

 

 

 

 

 

반응형

'Study > Python' 카테고리의 다른 글

Python-14  (0) 2020.11.03
python-13  (0) 2020.10.26
python-11  (0) 2020.10.26
python-10  (0) 2020.10.26
Python-9  (0) 2020.09.12
반응형

**파이썬 콘솔 입력

input('메시지') 를 호출하면 한 줄의 텍스트를 입력받고 리턴해주는 함수

 

name = input('이름을 입력하세요');

 

**문자열 데이터를 숫자로 변경하기

int('정수 문자열') : 정수로 변환되서 리턴

float('실수 문자열') : 실수로 변환되서 리턴

 

하나의 정수를 입력받기

n = int(input('정수를 입력하세요')) # 별로 좋지 않은 방법

=>이것은 좋지 않는 방법이다.

함수나 메소드는 독립적으로 하는 것이다.

함수에 함수를 호출할 경우는 늦어진다.

함수 안에 함수 일 경우는 재귀

 

s = input('정수를 입력하세요');

n = int(s);

 

inp = input('정수를 입력하세요') #한줄의 문자열을 입력받아

n = int(inp) #정수로 변환하기

print(type(n)) #자료형 확인

 

**파이썬의 제어문

=>제어문은 하나의 블록

코드:

           내부코드

           내부코드

블록과 상관없는 코드

 

 

1.    분기문(갈림길)

if 표현식:

      표현식의 내용이 True 일 때 수행할 내용

elif 표현식:

      앞의 표현식이 False이고 자신의 표현식이 True일때 수행할 내용

elif 중복 작성 가능

else:

      앞의 모든 표현식이 거짓일 때 수행할 내용

 

=>표현식은 데이터가 만들어지면 전부 표현식입니다.

=>True,False가 아니더라도 파이썬에서는 bool로 간주하는 경우가 있는데

숫자 데이터는 0이 아니면 True 이고 0 False로 간주

숫자 이외의 데이터는 데이터가 존재하면 True데이터가 없으면 False

데이터가 없다는 것은 변수 = None

없는 변수 이름을 사용하면 에러 -Undefined입니다.

=>elif else는 상황에 따라서 생략 가능

=>elif 중복 가능하지만 else1번만 나와야 합니다.

 

1.    하나의 문자열을 입력받아서 남자라고 입력하면 man이라고 출력하고 여자라고 입력하면 woman이라고 출력하고 그 이외의 경우는 잘못된 입력이라고 출력해주는 문제

 

person = input("성별을 입력하세요")

if person == '남자':

      print('man')

elif person == '여자':

      print('woman')

else:

      print('잘못 된 입력')

 

연습 : 정수 한개를 입력받아서 3000 이상이면 대형차

        2000- 2999이면 중형차

        그 이외의 경우는 소형차라고 출력

 

inp = input('정수를 입력하세요')

n = int(inp) #정수로 변환하기

if n >= 3000:

    print("대형차")

elif n>= 1000 and n <= 2999:

    print("중형차")

else:

print("소형차")

 

 

 

정수 한개를 입력받아서 3000 이상이고 7000 이면 대형차

        2000- 2999이면 중형차

      1000- 1999 이면 소형차라고 출력

      나머지 경우는 이상한 배기량이라고 출력

 

inp = input('정수를 입력하세요')

n = int(inp) #정수로 변환하기

if n >= 3000 and n <= 7000:

    print("대형차")

elif n>= 2000 and n <= 2999:

    print("중형차")

elif n>= 1000 and n <= 1999:

    print("소형차")

else:

print("이상한 배기량")

 

2.    while -반복문 (Loop, Iterator)

while 표현식:

            표현식이 False가 아니라면 수행할 내용

           =>while은 대부분의 경우 몇 개 인지 알 수 없을 때 사용하는 반복문

실제 while을 사용하는 대부분의 경우는

 

while True:

           if 표현식:

                       break

           반복 수행할 내용

 

파일에 7줄인지 아는 것은 처음 읽고 있으면 읽어라 없으면 그만하라 이런식으로 읽는다.

한줄 씩 가져와서 더이상 읽을 것 없으면 나완다.

7줄인지 아면 for사용하고 몰라서 while이다.

 

 

3.    for - 반복문 (Loop , Iterator)

=>반복할 횟수를 알거나 데이터의 모임을 순회할 떄 사용

for 임시변수 in 데이터의 모임:

            반복할 내용

=>데이터의 모임에서 하나씩 순서대로 꺼내서 임시변수에 대입하고 내용을 반복

=>데이터의 모임인지 확인하는 방법 : dir을 이용해서 사용가능한 속성 중에서 __iter__가 있으면 이 데이터는 순회가능한 데이터의 모임

 

 

li = [100,200,300]

 

for imsi in li:

            print(imsi)

 

li = [100,200, 300]

print(dir(li)) #__iter__

li = [100,200, 300]

#print(dir(li)) #__iter__

for imsi in li:

    print(imsi)

 

 

 

4.    range

range(시작값, 종료다음 값, 간격) : 시작값 부터 간격 단위로 종료값까지 순회하는 순서열을 생성해서 리턴해준다.

 

print(dir(range(0,10,1)))

 

 

 

 

for imsi in range(0,10, 1):

print(imsi)

 

range(종료다음값): 시작값은 0으로 간격은 1로 설정을 해줍니다.

 

연습문제 1) while을 이용해서 아래와 같은 문장을 출력(신문기사 패턴)

i = 1

while i <= 3:

    print("article",i)

i = i+1

 

 

연습문제 2) for를 이용해서 아래와 같은 문장을 출력

num = 1

num = 16

num = 31

num = 46

for  i in range(1, 5, 1) :

    print("num=" , 15 * i - 14)

 

for  i in range(0, 4, 1) :

print("num=" , 15 * i +1)

 

 

 

=>위와 같은 형태를 출력해보는 이유는 웹에서 데이터를 수집할 때 많은 양의 데이터는 대부분 페이징 처리가 되어 있어서 페이지에 해당하는 URL패턴을 찾아서 프로그램에서 수집할 수 있도록 해주어야 합니다.

 

https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC&page=2

https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC&page=3

 

 

5.    제어문의 중첩

=>제어문 안에 제어문 사용이 가능

 

6.    break continue

1)    break: 가장 가까운 반복문을 종료하는 제어문

2)    continue: 가장 가까운 반복문의 다음 수행으로 이동하는 제어문

ð  반복문 안에서 if와 함께 사용

ð  파이썬에서는 반드시 if 와 함께 사용

 

for i in range(1,4, 1) :

      if i % 2 == 0:

                 break;

print(i)

ð  짝수가 되면 반복문을 중단하는 것이므로 1만 출력

 

for i in range(1,4, 1) :

      if i % 2 == 0:

                 continue;

print(i)

ð  짝수가 되면 다음 반복으로 넘어가라는 의미이므로 1,3 출력

 

데이터 수집 같은 것들을 할 때 특정 조건을 만날 때 까지만 수집

회사이름으로 올라온 신문기사를 스크랩할 것인데 오늘 날짜에 해당하는 기산만 스크랩하고 하는 경우에는 조건을 만들어서 break를 시켜 주어야 합니다.

 

댓글 수집을 하는 경우 하나의 아이디가 여러 개의 댓글을 남겼다면 이런 경우는 첫번째 데이터만 읽고 나머지는 패스 해버려야 합니다.

이런 경우는 continue를 사용합니다.(조작할 가능성이 높기 때문이다.)

 

똑같은 것이 있으면 댓글 달면 두개씩 똑같은 것있으면 다음으로 넘어가라 continue를 사용한다.

광고에서는 똑같은 ip에서 글이 두개 이상 있으면 읽지 말아라

break는 이것은 하지 말자 : 중복이다.

 

7.    for ~ break ~ else

for 표현식:

      if 표현식:

                 break:

else:

      수행할 내용

=>elseforbreak에 걸리지 않고 전부 수행한 후 종료되었을 때 수행할 내용

for i in range(1,4,1):

           if i % 2 == 0:

                       break

else:

           print("반복문을 전부 수행")

 

ð  이 경우는 2에서 break를 만나서 반복문이 종료되었으므로 else내용을 수행하지 않음

반복문을 수행하다가 문제가 생겼다면 멈춰라

 

 

for i in range(1,4,1):

           if i % 4 == 0:

                       break

else:

           print("반복문을 전부 수행")

 

ð  이 경우는 break를 만나지 않고 반복문이 종료되었으므로 else 내용을 수행

반복문을 수행하다가 문제가 생기지 않았다면 계속 하라

 

이 두가지 경우는 머신러닝은 아니지만 업무 상으로 한다.

이런것은 연차 를 사용하는 것은 매일 찍다가 안 찍으면 쉴 수 없다.

게임은 출석 이벤트 할 경우 1주일 연속 나오면 뭐 주는 것 등 ...

분석은 사용한지 별로 없다.

하지만 구글 analystice에서는 해준다.

 

 

** Function(함수)

=>자주 사용하는 코드를 독립적인 모듈로 만들어 둔 것

=>별도의 메모리 영역을 할당 받아서 코드를 실행

 

1.    종류

1)    Maker Function : 처음부터 제공되는 함수

2)    User Define Function: 사용자가 만든 함수

3)    3rd party Function: 제조사가 주지 않고 내가 만들지 않은 함수로 이 함수들은 패키지를 다운로드 받아서 설치해야만 사용이 가능

 

2.    Python에서 함수를 표현

이름(매개변수) -> 리턴타입

 

이름(매개변수): 이 경우는 이 함수가 데이터를 리턴하지 않는 경우에 가능성이 높음

아래 설명문에서 리턴을 한다고 작성하는 경우도 있습니다.

 

3.    용어

ð  매개변수는 함수를 호출할 때 넘겨주어야 하는 데이터

ð  리턴은 함수를 수행하고 난 후 남겨주는 데이터

ð  리턴이 있으면 출력을 할 수 있고 변수에 저장해서 재사용 가능

ð  리턴이 없으면 출력도 못하고 변수에 저장도 안됨

 

4.    함수의 사용법 확인

help(함수명)

 

help(max)

->가 있기 때문에 뭔가를 준다.

help(list.sort)

->return None이다  반드시 데이터를 받는다 .그래서 sort해서 준다.

리턴이 없다면 내가 데이터를 줘야하고 그 데이터는 변경되여서 온다.

리턴을 안해주면 내거 받을 수 었다.

 

ð   return 이 없는 함수는 내 데이터를 받아서 데이터에 작업을 수행합니다.

 

li = [100,300,200]

print(li.sort())

 

li = [100,300,200]

li.sort()

print(li)

li자체가 정렬된다.

 

python에서는 help 꼭 해주기를 바란다. 예측이 가능하다.

 

5.     파이썬에서는 함수가 일급 객체

ð  파이썬에서는 함수도 하나의 데이터

ð  함수()은 함수를 호출해서 실행하는 것입니다.

ð  함수는 함수가 저장된 곳의 참조를 의미합니다.

 

li = [100,300,200]

li.sort #에러가 안난다.

print(li.sort)

#<built-in method sort of list object at 0x000001870D6CE180>

built-in 함수가 만들어진것이다.

함수의 주소를 쓰버린 것이다.

 

6.    빌트 인 함수 확인

dir(__builtins__)

 

파이썬에서 __ 있는 것은 예약어 (시스템이 사용하는 것)

print(dir(__builtins__))

아래의 것들은 처음부터 주는 함수이다.

 

 

 

반응형

'Study > Python' 카테고리의 다른 글

python-13  (0) 2020.10.26
python-12  (0) 2020.10.26
python-10  (0) 2020.10.26
Python-9  (0) 2020.09.12
python-8  (0) 2020.09.12
반응형

**python

1.설치

=>python만 설치

=>anaconda와 같은 배포판 설치: 자주 사용하는 라이브러리와 IDE가 같이 설치

=>python기본 문법만 학습하거나 python애플리케이션 만드는 것이 목적일 때는 python만 설치하고 데이터 분석을 위해서 설치할 때는 anaconda와 같은 배포만 설치

 

2.IDE

=>python만 설치된 경우는 python console 이나 idle사용

=>anacondaJupyter notebook( 보고서 만들기 , 자동완성 기능이 없음 .을 찍을 경우 ,블로그 할때 tag사용 )spyder(애플리케이션 만들기 , .찍을 경우 자동완성 기능이 된다.) 를 제공 초보자가 처음 분석을 공부할 때는 jupyter notebook보다는 spyder를 권장

=>vscodepycharm(가상 환경 만들기가 편함 - 프로젝트 할 때 유용) 을 별도로 설치해서 사용

 

3.파이썬 프로그램의 구성 요소

1)Literal: 개발자가 직접 입력하는 데이터

2)Variable : 데이터를 저장해두고 다음에 다시 사용하기 위해서 붙인 이름

 

3)Expression(표현식) : 한번에 수행되는 문장

 

4)function: 자주 사용되는 변수나 리터럴 그리고 표현식을 묶어서 하나의 메모리 영역을 할당받아서 수행하도록 해주는 개체 - 실행 단위

 

5)class& instance(객체): 자주 사용하는 데이터와 함수를 묶은 것

 

6)Module:하나의 파일 - 하나의 파일 안에 여러개의 클래스 및 함수가 존재할 수 있습니다.

 

7)Package :Modele의 집합 - 배포 단위

 

8)comment(주석): 실행과는 상관없는 문장 - # 다음에 나오는 한줄의 문자열

 

데이터 분석 분야에서 일하고자 할 때는 주선을 습관화 할 필요가 있습니다.

 

 

4.작성 규칙

=>한 번에 실행되는 문장(표현식) 은 한 줄에 작성

=>한 줄에 표현식이 2개면 ;으로 구분

=>블럭을 만들 때는 반드시 : 을 붙이고 블럭 내의 문장은 일정한 들여쓰기를 해야 합니다.

블럭은 제어문, 함수, 클래스, 예외처리구문 입니다. (반드시 ;을 붙이고 일정한 들여쓰기를 해야 합니다.)

들여쓰기를 해제 하면 이전 블럭이 끝나게 됩니다.

=>파이썬은 줄 단위로 해석하면서 실행되면 한 번에 실행되는 문장의 끝에서 데이터를 출력할 때는 데이터만 남겨도 출력이 됩니다.

마지막에는 print()를 사용안해도 된다.

=>콘솔 출력은 print(데이터)

=>여러 개 출력할 때는 , 로 구분해서 설정하면 같이 출력

a = 10

a #이 문장이 마지막 문장이라면 출력

#그렇지 않으면 출력 안

b = 10

print(a)

print(a,b)

결과 :

 

=>#! 는 주석이 아닙니다.

유닉스의 shebang으로 프로그램의 일부분입니다.

#! _*_ coding:인코딩 방식_*_: 이 문장은 아래 파이썬 코드의 인코딩 설정입니다.

대부분 utf-8 windows cp949이다.

 

5.python에서 litearal작성 방법

1)정수는 10진수로 작성

2)실수는 정수부분.소수부분으로 작성

3)복소수는 가능 :정수 + 또는 - 정수j

Python에서는 복소수 데이터도 표현할 수 있어요. c=2+3j 처럼 실수부 + 허수부j로 표현합니다. 수학에서 표현하는 i가 아니라 j를 사용하는 것에 주의하세요. 그리고 복소수에서 실수부의 값에 접근할 때는 .real을 사용하고 허수부에 접근할 때는 .imag를 사용합니다.

>>> c = 2+3j

>>> print(c)

(2+3j)

>>> print("실수부:{0}, 허수부:{1}".format(c.real,c.imag))

실수부:2.0, 허수부:3.0

복소수의 뜻과 성질인데요

우선 허수에 대해 먼저 말씀드리고 시작할까 합니다

허수(

 ) 제곱해서 -1이 되는 수 ±√-1 인데요

여기서 √-1을 문자 i로 나타내어 허수단위라 하고,
i
 포함하는 수를 허수라 합니다

 a > 0 일 때, √-a = √a·i 인데요

 

복소수란 a,b 실수이고

일 때  a + bi 꼴의 수를 복소수라 합니다

따라서 복소수

 체계를 살펴보면 아래와 같은데요

 

 

참고로 z가 복소수일 때 z² < 0 일 조건을 살펴보면

z = ai( a≠0 인 실수 ) 이면 z² = -a² < 0

따라서 z 순허수일 때, z² < 0 이 됩니다

 

또한 복소수가 서로 같을 조건을 살펴볼텐데요

a,b,c,d  실수이고, i =  √-1 일 때

1) a+bi = 0 ⇔ a = 0, b = 0

2) a+bi = c+di ⇔ a = c , b = d

이미지 처리 할 때사용

딥러닝할때 사용할 수도 있다.

4j ->허수 존재하지 않는 데이터

e-> 존재한 데이터  자연로그

전기쪽에서 많이 사용한다.

 3+ 4j -> 3은 유리수 4는 허수

 

4)bool데이터 : TrueFalse

5)문자열: ''"" 사이에 한 줄의 문자열을 대입

           ''' 여러 줄''' 또는 """ 여러줄 """

           어떤 코드를 실행시키지 않을 의도로 따옴표 3개로 묶는 경우가 있습니다.

"""

a = 10

a #이 문장이 마지막 문장이라면 출력

#그렇지 않으면 출력 안

b = 10

print(a)

print(a,b)

 

"""

print(1000)

 

           역슬래시 다음에 영문자 1개가 오면 제어문자로 특별한 의미를 갖는 문자가 됩니다.

           \n -> 줄 바꿈

           \t ->

           \"" -> " 큰따옴표

           \' -> ' 작은 따옴ㅍ

           \\ => \ 역슬래시

 

6)byte배열(bytes): b'문자열', b'\코드\코드'

 

7)list(비교 가능한 데이터의 모임):[데이터, 데이터 ...]

8)tuple(변경 불가능한 데이터의 모임): (데이터, 데이터...) ,데이터가 1개인 경우는 (데이터,)

9)set(중복 불가능한 데이터의 모임): {데이터, 데이터...}

10)dict(키와 값의 모임):{: , : ...}

11)None: 데이터 없음을 의미

 

6.가장 중요한 함수 => 매우 중요하다.

1)type(데이터) : 데이터의 자료형을 문자열로 리턴

2)dir(데이터) : 데이터가 사용할 수 있는 속성과 함수의 목록을 리턴

3)help(함수) : 함수를 사용하는 방법과 설명

=>직접 만든 함수의 결과가 아니면 type으로 확인해보고 사용할 수 있는 속성이 함수의 목록을 확인해보고 help로 도움말도 확인해보는 것이 좋습니다

print(type(1000))

#print(dir(1000)) #속성과 함수를 확인

help(int.bit_length) #6진수

 #사용법 확인

print((1000).bit_length()) #몇 비트로 만들어지는지 확인

나중에 필요한 것은 찾아서 사용해아야 한다. 그 기능이 help이다.

python은 메뉴얼을 따로 안주고 찾아서 해야 한다.

 

7.keyword

=>파이썬이 만들어 둔 예약어 : 기능이 이미 구현되어 있음

=>다른 용도로 사용할 수 없음

확인하는 방법은

import keyword

print(keyword.kwlist)

여기 내용은 사용할 수 없다. 이것 제외하고 사용가능하다.

 

8.identifier(식별자)

=>개발자가 기능을 정할 수 있는 이름

=>식별자로 keyword는 사용할 수 없음

=>식별자로 만들고 기능을 부여하면 자신의 영역에 없는 식별자면 자신의 영역에 새로만들고 기능을 부여하고 자신의 영역에 존재하는 식별자면 기능을 수정합니다.

 

=>기능 부여하기

이름 = 기능;

 

 

=>식별자의 기능을 찾는 순서

현재 모듈 ->파이썬의 설정에  따라 다릅니다.

 

=>파이썬이 제공하는 식별자의 이름을 자신의 모듈에서 값을 대입하면 기존의 기능을 사용할 수 없습니다.

 

=>식별자를 찾는 순서

import sys

print(sys.path)

=>Mac이나 Linux등에는 Python 2.x버전이 설치가 이미 되어 있는데 3.x버전을 설치하면 기존 버전과 함께 존재

파이썬 패키지를 다운로드 받았는데 없다고 메시지가 출력되는 경우가 있습니다.

이 경우에는 path를 확인

첫번째것이 나의 위치

그다음 python 디렉토리

실수 할 수 있는 상황:

print(dir(list))#list의 기능 확인

#python이 준 list

#바꾸기 전의 list

print()

list = 200

print(dir(list))#list의 기능 확인

#list = 200이기 때문에 int로 변한다.

list -> int로 바꾸고  나면 기능이 list로 된다.

문자열 : str

데이터 목록 : list

 

 

9.Variable

=>데이터를 저장하고 저장한 데이터에 이름을 붙이는 것

식별자 = 데이터

=>변수는 생성된 블럭에서만 사용 가능

블럭이 없어지면 메모리도 없어지기 때문에 같이 소멸됩니다.

=>변수를 만드는 이유는 데이터를 다음에 또 사용하기 위해서 입니다.

 

#좋은 방법이 아님

print(200)#상수 값을 바로 출력

 

#다음에 사용할 지 않을 지 모르기 때문에 변수에 저장하고 사

result = 200# 200이라는 값을 result에 저장

print(result) #result의 값을 출력

#result를 사용할 가능성이 높다.

사용안하면 지우면 되니깐 변수를 사용하는 것이 좋다.

변수로 하는 습관을 하기

 

 

 

테스트 완료했는데 결과가 정확하지 않을 경우 다시 처음부터 수정해야 한다.

=>리터럴이나 연산식의 결과 또는 함수의 결과를 바로 사용하지 말고 변수에 저장한 후 사용하는 것을 습관하는 것이 좋습니다.

=>데이터 분석을 할 때는 특별한 경우가 아니면 기존 변수를 수정해서 사용하지 않는 것이 좋습니다.

중간 결과가 전처리한 데이터들은 새로운 변수에 저장하는 것을 습관화 해야 합니다.

데이터 분석에서는 중간 결과나 초기 데이터 등을 재사용할 가능성이 높기 때문입니다.

분석은 대용량의 데이터를 다루기 때문에 데이터를 다시 불러오거나 전처리를 다시하면 시간이 오래 걸릴 가능성이 높습니다.

#아래 처름 하지 말라

#a가 원래 가지고 있는 10이 없어져서 다시 해야 한다.

#이 방식은 기존의 데이터가 없어져버림

a = 10

print(a)

 

a = a+ 5

print(a)

 

#기존의 데이터를 보존

#b의 데이터가 필요하면 또 작업을 하면 된다.

b = 10

print(b)

 

c = b+5

print(c)

 

 

10.연산자

1).산술 연산자

+ : 동일한 종류의 데이터끼리만 사용이 가능

숫자끼리는 덧셈을 하지만 숫자가 아닌 경우는 결합

 

- : 숫자 끼리 뺄샘

 

* :숫자 끼리는 곱셈, 숫자가 아닌 데이터 * 수자를 하면 반복

2* 3 : 6

"Python" * 3 : "PythonPythonPython"

 

 

/ : 실제 나누기

 

// : 몫을 정수로

% : 나머지

 

** : 거듭 제곱 : 3 ** 3 = 27

 

2)비교 연산자

>, >= , < , <=

== , !=

=> 이 연산자들은 동일한 자료형끼리만 가능

>, >=, <, <= 는 숫자 데이터에만 사용

== , != 는 모든 자료형에 사용

=>연산의 결과는 True아니면 false

=>bool데이터와 숫자 데이터 사이에 사용되면 bool데이터는 True 1 False0으로 간주

1 == True

비교는 똑같은 것을 비교한다.

=>산술 연산자보다 우선순위가 낮습니다.

같은 줄에 있으면 산술연산자 하고 비교연산자 한다.

 

3)비트 논리 연산자 : 분석이나 이미지 처리 그리고 Embedded에서 중요

=>정수 데이터를 2진수로 변환해서 비트 단위로 연산을 한 후 결과를 다시 정수로 변환해주는 연산자

=>비트 각각을 연산

&: and - 둘 다 1인 경우 만 1 나머지 경우는 0

|: or - 둘다 0인 경우만 0 나머지 경우는 1

^: xor -두개가 같은 경우는 0 다른 경우는 1

~: 1의 보수 연산(0->1, 1->0)

=>각각 연산을 해서 결과를 만드는 것이 중요

데이터의 모임끼리 이 작업을 수행하면 데이터 각각을 연산해서 데이터의 모임으로 결과를 리턴

1010개 연산하면 10개 나온다.

 

<<: 왼쪽의 데이터를 오른쪽의 숫자만큼 왼쪽으로 shift

>>: 왼쪽의 데이터를 오른쪽의 숫자만큼 오른쪽으로 shift

 

 

4) 조건 논리 연산자

&&: and

|| : or

=>데이터 전체를 하나로 보고 연산을 해서 결과도 하나만 생성

=>연산의 결과를 True또는 False로 리턴

1010개 연산하면 1개 나온다.

5)기타 연산자

in: 왼쪽의 데이터가 오른쪽에 소속되어 있는지를 리턴

not in : 왼쪽의 데이터가 오른쪽에 소속되지 않았는지를 리턴

is : 동일한 데이터를 가리키는지를 리턴 (가리키는 데이터가 같은지)

is not: 동일하지 않은 데이터를 가리키는지를 리턴

type:데이터의 자료형 리턴

id(데이터): 데이터의 참조를 리턴

=>intype이 자주 사용

=>나머지는 공부할 때만 학습

 

6) 할당 연산자

= : 오른쪽의 값을 왼쪽의 변수에 대입

+= : 왼쪽 변수의 값에 오른쪽의 값을 + 한 후 결과를 왼쪽의 변수에 대입 ( 별로 안좋다. 왼쪽데이터가 변하기 때문에 분석가 입장에서는 안좋다.)

 

+연산자 실습:

r = 10 + 5#숫자끼리의 덧셈은 덧셈

print(r)

 

k = [1,2,3] +[4,5,6]# 숫자 이외의 덧셈은 결합

print(k)

k가 리스트

#k sort를 가지고 있으면 호출

if sort in k:

k.sort()

x= 20

if x in k:

    print(k.x)

else:

print("데이터 없음")

x= 6

if x in k:

    print(k[x])

else:

print("데이터 없음")

 

 

 

 

 

 

 

 

반응형

'Study > Python' 카테고리의 다른 글

python-12  (0) 2020.10.26
python-11  (0) 2020.10.26
Python-9  (0) 2020.09.12
python-8  (0) 2020.09.12
Python-7  (0) 2020.09.12
반응형

 

웹 크롤링 - 데이터 수집

 

쉽게 배워 제대로 활용하기!

1. 단순 반복을 줄여주고 빠르게 처리하는 웹 크롤링!

웹 크롤링은 단순 반복을 줄여주고 빠르게 처리할 수 있으며, 일의 효율을 높여주고 인간이 좀 더 창의적인 활동에 집중할 수 있도록 도와주는 좋은 도구이다.

2. 초보자도 해볼 수 있는 수준!

꼭 알아야 할 핵심 개념은 기본 예제로 최대한 쉽게 설명하여 처음 배우는 분들도 쉽게 해볼 수 있는 수준이다.

3. 실습 환경

파이썬 문법으로 작성한 소스코드를 실행하는 파이썬3

파이썬을 개발하는 도구인 파이참

크롤러를 만들 때 크롬에 있는 개발자 도구를 활용하기 위한 크롬(Chrome)

 

1. HTTP

HTTP Hyper Text Transfer Protocol의 약자

하이퍼 텍스트는 마우스로 클릭하면 다른 페이지로 이동하는 기능을 말함.

HTTP HTML로 작성되어 있는 하이퍼 텍스트를 전송하기 위한 프로토콜임.

프로토콜은약속, 규칙, 규약이라는 뜻

A라는 지점에서 B라는 지점으로 데이터를 보낼 때 어떻게 보낼 것인지에 대한 규칙임.

• 인터넷 주소를 쓸 때 앞에 http://www.google.com 처럼 http를 붙임.

 

2. URL

URL(Uniform Resource Locator)은 인터넷 주소

• 보통 웹 브라우저에서 주소 표시줄에 나오는 주소를 의미함.

• 정확히는 네트워크상에서 자원의 위치를 알려주는 주소임.

URL https://www.naver.com일 때, https 라는 규약(프로토콜)으로 www.naver.com라는 주소의 실제 위치에 접속해서 정보를 가져오겠다는 의미임.

3. HTML

=>HTML Hyper Text Markup Language의 약자

• 마크업 언어라는 것은 일종의 문법임.

• 우리가 검색하고 방문하는 웹 페이지들은 웹 페이지를 작성하기 위한 어떤 문법에 의해서 작성되는 데 , HTML도 문법들 중 한 종류임.

크롤링 ->인터넷에서 데이터 들고오는 것

크롤러 ->데이터를 들고와서 개발 하는 것

파싱 ->그중에서 내가 원하는 단어 문장 등을 가져오는 것

 

소스코드를 이미지등 예쁘게 하는 것은 rendering 이라고 한다.

참조한  inteprete가 없을 경우 결과가 안나온다.

 

=>웹 페이지 소스코드

HTML 역시 웹 프로그램을 만들기 위한 프로그래밍 언어임.

• 글씨, 이미지, 웹 페이지에서 연결하려는 특정 주소 등 다양한 정보를 담으며 태그(tag) 와 함께 사용됨.

• 태크는 <head> <link> <html> 등과 같이 사용하는 일종의 약속된 키워드임.

1. 개발환경 설치하기

파이참 설치하기

파이썬을 개발하는 도구로 편한라이브러리 설치기능과 코딩 소스코드를 매끄럽게 작성할 수 있게 도와주는자동 완성 기능등이 있음.

파이참 홈페이지(www.jetbrains.com/pycharm)에서 Download를 클릭함

Community Download를 클릭하여 다운로드함

Next 버튼 클릭하여 설치 파일 설치하기

Next 버튼 클릭하여 파이참 설치 경로 지정하기

‘64-Bit launcher’ ‘.py‘ 옵션 설정 후 Next 버튼 클릭

파이참을 시작 메뉴에 추가하기 위해 Install 버튼 클릭

Finish 버튼 클릭하여 설치완료

 

=>프로젝트 만들기

Create New Project을 클릭함

 

=>프로젝트가 생성될 위치 지정하고, Create 버튼 클릭

‘C:\crawl’ 에 프로젝트를 만듦

경로를 바꿀 수 있음

=>‘Close’ 버튼 클릭

 

=> “hello” 출력하는 프로그램 작성하기

Project  crawl  New  Python File 클릭 후, 프로그램명(hello) 입력

 

=>소스코드 작성하기

print("hello")

 

=>파이썬 프로그램 실행하기

상단의 메뉴에서 [Run  Run…]을 눌러서 실행할 수 있음

 

=>패키지 추가하기

메뉴 File -> Settings -> Project Interpreter 클릭

 

=>인터프리터에서 라이브러리 추가하기

우측의 + 버튼을 누름

 

=>라이브러리 검색하여 설치하기

라이브러리 선택 후 Install Package 누름

 

=>크롬(Chrome) 설치하기

크롬에 있는 개발자 도구가 크롤러를 만들 때 필요한 도구임.

설치 페이지로 이동하기

www.google.com/chrome

 

=>크롬 다운로드하기

웹 페이지의 다운로드 버튼을 누르고, <NEXT> 버튼을 누르면 설치됨.

 

2. urllib 패키지

urllib는 파이썬에서 인터넷 상의 데이터를 받아 오는 기능들이 들어 있는 패키지임. urllib에 인터넷 주소(URL)를 넣고 실행하면 데이터를 텍스트 형태로 받아옴. 데이터를 받아오는 것을크롤링이라고 함. urllib는 크롤링을 하는 라이브러리임.

=>urllib 설치하기

urllib는 기본적으로 내장되어 있기 때문에 파이썬이 설치되어 있다면 임포트(import)할 수 있음.

기본으로 제공하는 urllib 패키지 이외에 urllib5 등 다른 버전을 사용하고자하는 경우에는 Project Interpreter에서 package를 검색하여 설치함

[파이참] 메뉴에서 [File → settings→ Project Interpreter] 패키지 검색하여 설치

 

=>네이버 첫 페이지 받아오기

크롬을 켜고 주소창에  www.naver.com을 입력해서 네이버로 들어감.

 

네이버 접속하고 마우스 오른쪽 버튼을 클릭해서페이지 소스보기를 선택

 

=>네이버 첫 페이지의 소스코드로 HTML 형식으로 되어 있음.

웹 브라우저는 텍스트 형태로 되어 있는 HTML 문서를 읽어서 우리가 보기 좋게 그려 주는 렌더링(rendering) 기능을 하는 프로그램임.

크롤링을 한다는 것은 이 텍스트 형태의 데이터를 받아오는 것을 말하며, 받아온 데이터에서 내가 필요한 것을 뽑아내는 것을파싱이라고 함.

요즘에는 크롤링, 파싱, 스크래핑이인터넷에서 무언가 데이터를 받아서 필요한 정보만 뽑아 내는 것이라는 뜻으로 같이 사용됨.

 

=>네이버 크롤링하기

파이참 실행하여 네이버 첫 페이지의 데이터를 크롤링하기

# url_open.py

from urllib.request import urlopen
url = "https://www.naver.com"
html = urlopen(url)
print(html.read())
#첫페이지 크로링 결과
#bs4 를 이용해 파싱해야 한다.

결과:

이 텍스트를 웹 브라우저에서 해석해서 초록색으로 배치가 잘 된 화면을 보임.

웹은 HTML 형태로 되어 있어서 이 HTML 텍스트를 받아온 다음에 여기에서 우리가 필요한 정보들을 파싱할 수 있음.

#bs4 를 이용해 파싱해야 한다.

 

=> 크롤링의 과정

==>페이지를 불러온다.

urllib.request를 써서 불러온다.

urlopen(url)을 쓴다.

==> 파싱을 한다.

bs4.BeautifulSoup으로 파싱한다.

개발자 도구를 켜서 원하는 데이터가 있는 위치를 찾는다.

 

3. 뷰피풀솝 사용 방법

=>BeautifulSoup(뷰티풀솝)

뷰티풀솝은 데이터를 추출하는 데 필요한 기능이 들어 있는 라이브러리이며,파싱 라이브러리라고도 함.

• 모래(반도체원료, 규소) = html(BeautifulSoup)

뷰티풀솝은 텍스트를 단계별로 접근을 할 수 있게 데이터를 구조화 시켜줌.

HTML 소스코드(문서)는 웹 브라우저가 화면을 그리기 위한 내용들이 많이 들어가 있지만, 이 중에서 우리가 필요한 단어나 내용은 아주 조금이므로 파싱은 html 소스코드에서 필요한 내용만 뽑아내는 것임.

=>library(라이브러리)

많이 사용하는 기능들을 다른 사람 또는 회사가 만들어서 올려놓은 것

라이브러리는 import를 해서 사용함

내장 라이브러리와 외장 라이브러리가 있음

내장 라이브러리는 import해서 사용하고, 외장 라이브러리는 설치한 후

 

=>뷰티풀솝 설치하기

BeautifulSoup(뷰티풀솝)은 외장 라이브러리 이므로 따로 설치를 해야 함.

[파이참] 메뉴에서 [File → settings → Project Interpreter → bs4] 패키지 검색하여 설치

 

=>뷰티풀솝 사용 방법

임포트한 후에 HTML형식의 문자열(string) BeautifulSoup()에 넣어주고 find()를 이용해 필요한 부분만 뽑아낼 수 있음.

import해서 사용함

# beautiful_soup.py

import bs4

#BeautifulSoup(뷰티풀솝)

#뷰티풀솝은 데이터를 추출하는 데 필요한 기능이 들어 있는 라이브러리이며, 파싱 라이브러리라고도 함.

html_str = '<html><div>hello</div><div class ="ddd">hello1</div></html>'

#hello만 뽑아 올것이다.

#BeautifulSoup 예쁘게 나오기 위해서

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

#html_str소스 코드를 html.parser로 파싱하겠다.

 

print(type(bs_obj))

print(bs_obj)

print(bs_obj.find('div'))#FIND 테그에 있는 것 보여주기

print(bs_obj.find('div').text)#DIV에 있는  TEXT를 원해

결과:

 

=>HTML 다운 예제로 .find() 기능 사용

# bs4_2.py

import bs4

html_str = """

<html>

    <body>

        <ul>

            <li>hello</li>

            <li>bye</li>

            <li>welcome</li>

        </ul>

    </body>

</html>

"""

 

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

ul = bs_obj.find("ul")

print(ul)

결과:

 

 

=>여기에서 ‘hello’만 뽑아내려면 ul에서 li를 한 번 더 찾아주면 됨.

# fild_li.py

import bs4

html_str = """

<html>

    <body>

        <ul>

            <li>hello</li>

            <li>bye</li>

            <li>welcome</li>

        </ul>

    </body>

</html>

"""

 

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

ul = bs_obj.find("ul")#ul 이라는 태그를 뽑아 냄

li = ul.find("li")#ul에서 li 이라는 태그를 찾아 줌.

print(li) #.find()는 만나는 첫 번째 태그를 리턴해 주는 함수

결과:

 

 

=><li></li>태그 안에 있는 ‘hello’만 뽑아내려면 .text 속성을 사용함.

# find_li_text.py

import bs4

html_str = """

<html>

    <body>

        <ul>

            <li>hello</li>

            <li>bye</li>

            <li>welcome</li>

        </ul>

    </body>

</html>

"""

 

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

ul = bs_obj.find("ul")

li = ul.find("li")

print(li.text)#hello

결과:

 

=>findAll() 사용하기

.fildAll()은 조건에 해당하는 모든 요소를 리스트 [ ] 형태로 추출해주는 기능임.

# find_all.py

import bs4

html_str = """

<html>

    <body>

        <ul>

            <li>hello</li>

            <li>bye</li>

            <li>welcome</li>

        </ul>

    </body>

</html>

"""

 

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

ul = bs_obj.find("ul")

li = ul.findAll("li")

print(li)

#[<li>hello</li>, <li>by</li>, <li>welcome</li>]

결과:

 

=> 인덱스로 데이터 접근하기

인덱스(index)로 리스트 안에 있는 데이터에 접근할 수 있으며, 인덱스는 0부터 시작함.

# find_all_index.py

import bs4

html_str = """

<html>

    <body>

        <ul>

            <li>hello</li>

            <li>bye</li>

            <li>welcome</li>

        </ul>

    </body>

</html>

"""

 

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

ul = bs_obj.find("ul")

li = ul.findAll("li")

print(li[1])

결과:

=>맨 마지막 줄을 print(list[1].text)로 바꾸면 ‘bye‘만 출력됨

# find_all_index_text.py

import bs4

html_str = """

<html>

    <body>

        <ul>

            <li>hello</li>

            <li>bye</li>

            <li>welcome</li>

        </ul>

    </body>

</html>

"""

 

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

ul = bs_obj.find("ul")

li = ul.findAll("li")

print(li[1].text) # 두 번째 li 태그 안에 들어 있는 텍스트를 뽑아서 출력함

#bye

 

for i in li:

    print(i.text)

 

for i in range(len(li)):

    print(li[i].text)

결과:

 

=>태그와 속성 그리고 속성값

HTML <html>로 시작해서 </html>로 끝나는 문서이며, HTML은 태그(tag)와 속성(property)으로 구성되어 있음.

태그란 html 문서를 표현 할 때 쓰는 화면 구성을 하는 표시들로 문서에 있는 특정 부분에 꼬리표를 붙여준다는 뜻으로 tag라고 씀.

<html>, <div>, <ul>, <li>, <a>, <span> 등 있음.

<ul class=“greet”>

• 속성(property) : class

• 속성값 : “greet”

https://www.google.com/”>

• 속성(property) : href

• 속성값 : “https://www.google.com/

 

=>데이터 뽑을 때 class 속성 이용하기

HTML코드에 ul이 두 개 있는 경우, class 속성을 필터링 조건에 추가해서 추출함.

# property_class.py

import bs4

html_str = """

<html>

    <body>

        <ul class ="greet">

            <li>hello</li>

            <li>bye</li>

            <li>welcome</li>

        </ul>

        <ul class ="replay">

            <li>ok</li>

            <li>no</li>

            <li>sure</li>

        </ul>

    </body>

</html>

"""

 

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

ul = bs_obj.find("ul",{"class":"replay"})

print(ul)

결과:

 

.find()를 사용할 때, “ul”말고 {“class”:”replay”} 조건을 하나 더 추가해주면 뽑고 싶은 요소에 조금 더 정확하게 접근할 수 있음.

class를 이용하면 같은 태그가 있을 때 특정 블록을 선택해서 뽑아낼 수 있음.

 

=>속성값 뽑아내기

a태그에서 링크를 뽑아낼 때는 href라는 속성의 속성값을 뽑아내야 함.

# property_href.py

import bs4

html_str ="""

<html>

    <body>

        <ul class= "ko">

            <li>

                네이버</a>

            </li>

            <li>

                다음</a>

            </li>

        </ul>

    </body>

</html>

"""

bs_obj = bs4.BeautifulSoup(html_str,"html.parser")

atag = bs_obj.find("a")

print(atag)

print(atag.text)

print(atag['href'])

print("="*50)

atagl = bs_obj.findAll("a")

for i in range(len(atagl)):

print(atagl[i]['href'])

결과:

a태그에 들어 있는 텍스트인네이버를 뽑으려면 atag.text를 사용함

href속성의 속성 값인 네이버의 주소 https://www.naver.com/을 뽑기 위해서는 atag[‘href’] 이렇게 대괄호 안에를 붙인 속성을 넣어주면속성값을 뽑아낼 수 있음.

a태그에서 대괄호 안에 'href‘를 붙인 속성을 넣어주면 속성값을 뽑아 냄

 

4. 네이버에서 특정 글자 추출하기

네이버 첫 페이지에서 맨 오른쪽 위에 있는네이버를 시작페이지로라는 단어 두 개만 뽑아보기

=> urllib로 네이버 첫 페이지 데이터 받아오기

웹에서 데이터를 받아오려면 request라는 요청을 보내서 받아와야 함.

파이썬에서 웹의 특정 주소로 요청을 보내는 기능은 urllib.requesturlopen() 이라는 함수를 사용함.

# naver_text.py

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)
#html이라는 변수 안에 텍스트 형식으로 네이버 첫
#페이지를 호출한 데이터가 문자열 형태로 들어감
print(html.read())

결과:

네이버 첫 페이지를 받아오면, b’<!doctype html> 시작해서 </html>로 끝나는 데이터가 받아와 짐.

 

=>뷰티풀솝에 데이터 넣기

urlopen() 이라는 함수를 이용해 받아온 데이터를 파싱하기 위해서는 뷰티풀솝에 데이터를 넣어서 파이썬에서 가공할 수 있는 형태로 만들어 주어야 함.

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)
#html이라는 변수 안에 텍스트 형식으로 네이버 첫
#페이지를 호출한 데이터가 문자열 형태로 들어감
#print(html.read())
bs_obj = bs4.BeautifulSoup(html,"html.parser")
print(bs_obj)

결과:

bs_obj = bs4.BeautifulSoup(html, "html.parser")

.BeautifulSoup(<받은텍스트>, <텍스트를 파싱할 파서>)에는 총 2가지가 들어감.

받은 텍스트 : 웹에서 받은 텍스트

텍스트를 파싱할 파서 : 웹 문서는 대부분 HTML로 되어 있어서 “html.parser”를 사용

- parser(파서)는 데이터를 뽑아내는(파싱) 프로그램임.

- 파이썬이 HTML 형식으로 인식하라는 뜻임.

- “html.parser”를 가장 많이 사용하며, “lxml” “xml” 등도 있음.

 

=>뷰티풀솝으로 필요한 부분 뽑아내기

원하는 데이터 HTML상에 어디에 있는지 찾기 위해서는 구글 크롬의개발자 도구’를 이용함.

크롬을 켜고 우측 상단에 ···버튼을 눌러서 [도구 더보기개발자 도구]

 

개발자 도구에서 왼쪽 위의 화살표 아이콘을 누르면 색이 파란색으로 바뀌고, 마우스를 움직여 원하는 위치를 클릭하면 소스코드에서 해당부분을 알려줌.

네이버를 시작페이지로버튼을 마우스로 찾은 후에 클릭하면, HTML 소스코드에서 어떤 부분인지 표시를 해줌.

네이버를 시작페이지로 <a>라는 태그 안에 텍스트가 들어 있는 형태임.

<a>네이버를 시작페이지로<span></span></a>

HTML 코드를 보면, <div>라는 태그 안에 <a></a>가 들어 있는 구조임.

div 태그 안에 class=“area_links” 부분은 클래스를 가지고 파이썬의 뷰티풀솝 라이브러리를 이용해 데이터를 뽑아낼 수 있기 때문에 매우 중요함.

<div class=“area_links”></div> 이 영역만 추출해보도록 하겠음.

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)
#html이라는 변수 안에 텍스트 형식으로 네이버 첫
#페이지를 호출한 데이터가 문자열 형태로 들어감
#print(html.read())
bs_obj = bs4.BeautifulSoup(html,"html.parser")# bs_obj에는 전체 소스가 들어 있음
#print(bs_obj)
top_right = bs_obj.find("div",{"class":"area_links"})
#div 태그 중에서 class “area_links”로 되어있는 div를 찾으라는 명령
print(top_right)

결과:

 

top_right = bs_obj.find("div", {"class":"area_links"})

bs_obj에는 전체 소스가 들어 있음.

bs_obj.find(“div“) 명령어는 전체에서 가장 처음 나타나는 <div>태그를 뽑으라는 명령

“div”옆에 ,(콤마)를 찍고 {“class”:”area_links”}를 추가하면, div 태그 중에서 class가 “area_links”로 되어있는 div를 찾으라는 명령

이제 필요한네이버를 시작페이지로글자만 뽑아보겠음.

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)
#html이라는 변수 안에 텍스트 형식으로 네이버 첫
#페이지를 호출한 데이터가 문자열 형태로 들어감
#print(html.read())
bs_obj = bs4.BeautifulSoup(html,"html.parser")# bs_obj에는 전체 소스가 들어 있음
#print(bs_obj)
top_right = bs_obj.find("div",{"class":"area_links"})
#div 태그 중에서 class “area_links”로 되어있는 div를 찾으라는 명령
#print(top_right)
first_a = top_right.find("a")#첫 번째 나오는 a태그를 찾음
print(first_a)# a태그 안에 있는 text만 뽑아냄

결과:

 

=>공지사항 등 기타 뽑아내기

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)
#html이라는 변수 안에 텍스트 형식으로 네이버 첫
#페이지를 호출한 데이터가 문자열 형태로 들어감
#print(html.read())
bs_obj = bs4.BeautifulSoup(html,"html.parser")# bs_obj에는 전체 소스가 들어 있음
#print(bs_obj)
top_right = bs_obj.find("div",{"class":"area_links"})
#div 태그 중에서 class “area_links”로 되어있는 div를 찾으라는 명령
#print(top_right)
first_a = top_right.find("a")#첫 번째 나오는 a태그를 찾음
print(first_a)# a태그 안에 있는 text만 뽑아냄
print(first_a.text)

first_a1 = bs_obj.find(
"a",{"class":"al_favorite"})
print(first_a1.text)

###공지사항
notice_div = bs_obj.find("div",{"class":"area_notice"})
notice_a = notice_div.find(
"a",{"class":"an_ta"})
print(notice_a.text)

notice_h2 = bs_obj.find(
"h2",{"class":"blind"})
print(notice_h2)

결과:

 

5. 네이버 메뉴 이름 뽑아내기

=>네이버 첫 페이지에서 메뉴에 있는메일‘, ‘카페’, ‘블로그등의 글자 뽑아내기

메뉴 이름을 뽑는 방법과 뉴스 페이지에서 뉴스 제목을 뽑는 방법은 아주 비슷하므로 메뉴를 뽑아 보면서 크롤링을 익힐 수 있음.

결과

 

=>추출할 범위의 class 알아내기

[크롬] 메뉴에서 [···버튼도구 더보기개발자 도구왼쪽위 화살표버튼]

<ul>···</ul>안에는 여러 개의 <li>···</li>태그가 들어 있으며, 네이버 메뉴들은 <li class=“an_item”>···</li> 구조 안에 들어 있음.

 

파이썬에서 <ul> 태그와 클래스(class)를 이용하여 li안에 있는 내용을 뽑아낼 예정임.

 

파이썬의 BeautifulSoup 라이브러리를 이용해 필요한 글자를 뽑아낼 수 있음.

ul 태그와 class “an_l” ul을 전체 문서에서 찾기

# naver_menu.py

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
,"html.parser")
ul = bs_obj.find(
"ul",{"class":"an_l"})# ul 태그 중에서 class an_l ul을 찾음
print(ul)

결과:

 

ul안에 들어 있는 각각의 li만 뽑기

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
,"html.parser")
ul = bs_obj.find(
"ul",{"class":"an_l"})# ul 태그 중에서 class an_l ul을 찾음
#print(ul)
for li in ul:
   
print(li)

결과:

 

=> .findAll( ) li만 뽑아내기

.findAll( )은 조건에 해당하는 모든 것들을 [ ]리스트 안으로 추출해주는 함수임.

반복문 for를 이용해도 되지만, 중간에 빈칸이 뽑히는 경우가 있어서 .findAll( )을 써서 한 번 더 뽑아 주는 게 좋음.

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
,"html.parser")
ul = bs_obj.find(
"ul",{"class":"an_l"})# ul 태그 중에서 class an_l ul을 찾음
#print(ul)
#for li in ul:
#    print(li)
lis = ul.findAll("li")# ul 안에 있는 모든 li를 찾으라는 명령
print(lis)

----- [ ]리스트 안에 <li></li>가 여러 개 들어 있으며, 콤마(,)로 구분된 형태

결과:

 

=> li 하나씩 꺼내서 출력하기

대괄호와 중간의 콤마(,)가 나오지 않게 하나씩 뽑아보기

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
,"html.parser")
ul = bs_obj.find(
"ul",{"class":"an_l"})# ul 태그 중에서 class an_l ul을 찾음
#print(ul)
#for li in ul:
#    print(li)
lis = ul.findAll("li")# ul 안에 있는 모든 li를 찾으라는 명령
# ul를 바로 for문을 사용하여 출력하면 중간에 빈칸이 뽑히는 경우가 있음
#print(lis)
for li in lis:
   
print(li)# lis 안에 있는 li들을 하나씩 꺼내서 출력

결과:

 

=>a태그 뽑아내기

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
,"html.parser")
ul = bs_obj.find(
"ul",{"class":"an_l"})# ul 태그 중에서 class an_l ul을 찾음
#print(ul)
#for li in ul:
#    print(li)
lis = ul.findAll("li")# ul 안에 있는 모든 li를 찾으라는 명령
# ul를 바로 for문을 사용하여 출력하면 중간에 빈칸이 뽑히는 경우가 있음
#print(lis)
for li in lis:
   
#print(li)# lis 안에 있는 li들을 하나씩 꺼내서 출력
   
a_tag = li.find("a")
   
# li안에 있는 a태그를 뽑아서 a_tag라는 변수에 넣으라는 명령(점점 세밀하게 필요한 내용에 접근 )
   
print(a_tag)

결과:

=> span인 것 중에 an_txt class 뽑아내기

<a>태그 안에 <span>이 두 개가 있으므로, 태그인 span과 클래스인 an_txt 두 조건으로 추출해야 함.

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
,"html.parser")
ul = bs_obj.find(
"ul",{"class":"an_l"})# ul 태그 중에서 class an_l ul을 찾음
#print(ul)
#for li in ul:
#    print(li)
lis = ul.findAll("li")# ul 안에 있는 모든 li를 찾으라는 명령
# ul를 바로 for문을 사용하여 출력하면 중간에 빈칸이 뽑히는 경우가 있음
#print(lis)
for li in lis:
   
#print(li)# lis 안에 있는 li들을 하나씩 꺼내서 출력
   
a_tag = li.find("a")
   
# li안에 있는 a태그를 뽑아서 a_tag라는 변수에 넣으라는 명령(점점 세밀하게 필요한 내용에 접근 )
    #print(a_tag)
   
span = a_tag.find("span",{"class":"an_txt"})
   
# span 태그 중에서 an_txt 클래스를 가진것만 뽑으라는 명령
   
print(span)

결과:

 

=>Text 뽑아내기

<span> 태그가 제외된, ‘메일만 들어 있는 순수한 텍스트만 뽑아내기

import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)# html이라는 변수 안에는 웹에서 받은 텍스트가 들어감

bs_obj = bs4.BeautifulSoup(html,"html.parser")
#bs4.BeautifulSoup() 에 웹에서 받은 텍스트를
#넣으면, 파이썬에서 가공할 수 있는 html 형태의
#텍스트가 bs_obj에 들어감
ul = bs_obj.find("ul",{"class":"an_l"})# ul 태그 중에서 class an_l ul을 찾음
#print(ul)
#for li in ul:
#    print(li)
lis = ul.findAll("li")# ul 안에 있는 모든 li를 찾으라는 명령
# ul를 바로 for문을 사용하여 출력하면 중간에 빈칸이 뽑히는 경우가 있음
#print(lis)
for li in lis:
   
#print(li)# lis 안에 있는 li들을 하나씩 꺼내서 출력
   
a_tag = li.find("a")
   
# li안에 있는 a태그를 뽑아서 a_tag라는 변수에 넣으라는 명령(점점 세밀하게 필요한 내용에 접근 )
    #print(a_tag)
   
span = a_tag.find("span",{"class":"an_txt"})
   
# span 태그 중에서 an_txt 클래스를 가진것만 뽑으라는 명령
   
#print(span)
   
print(span.text)# span 태그에서 text만 뽑아내는 부분

결과:

 

6. 네이버 뉴스 제목 가져오기

=>네이버 뉴스의 오늘의 기사 제목 가져오기

 

 

=>뉴스 페이지 불러오기

# naver_news.py import bs4
import urllib.request

url =
"https://www.naver.com"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
, "html.parser")
print(bs_obj)

결과:

 

=> 뉴스 제목 위치 찾기

[크롬] 메뉴에서 [···버튼도구 더보기개발자 도구왼쪽위 화살표버튼]

 

=> HTML 구조 분석하기

HTML 구조를 분석해 보면, <li>안에 <a>가 들어 있고, <a>안에 <strong>이 들어 있고, <strong>안에 뉴스 제목이 있는 형태임.

개발자 도구에서 선택된 부분은 <ul>안에 위의 구조가 반복되고, <li>가장 안쪽에 <strong>이 있고 거기에 기사 제목이 들어 있는 구조임.

• 선택한 범위는 ul이고, class ‘mlist2 no_bg’.

 

=> class ul 태그 찾기

import bs4
import urllib.request

url =
"https://news.naver.com/"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
, "html.parser")
#print(bs_obj)
mlist2_no_bg = bs_obj.find("ul", {"class": "mlist2 no_bg"})
#bs_obj에서 class ‘mlist2 no_bg’ ul 태그를 찾음
print(mlist2_no_bg)

결과:

 

=> .findAll( ) li들 뽑아내기

import bs4
import urllib.request

url =
"https://news.naver.com/"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
, "html.parser")
#print(bs_obj)
mlist2_no_bg = bs_obj.find("ul", {"class": "mlist2 no_bg"})
#bs_obj에서 class ‘mlist2 no_bg’ ul 태그를 찾음
#print(mlist2_no_bg)
lis = mlist2_no_bg.findAll("li")
#lis 변수를 선언하고, ‘mlist2 no_bg’ 에서 li 태그들을
#리스트[ ] 형태로 담으라는 명령
for li in lis:# for 문을 이용해 lis에 있는 li들을 하나씩 꺼내서 출력
   
print(li)

결과:

 

=> strong 태그와 그 안에 있는 기사 제목 뽑아내기

import bs4
import urllib.request

url =
"https://news.naver.com/"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
, "html.parser")
#print(bs_obj)
mlist2_no_bg = bs_obj.find("ul", {"class": "mlist2 no_bg"})
#bs_obj에서 class ‘mlist2 no_bg’ ul 태그를 찾음
#print(mlist2_no_bg)
lis = mlist2_no_bg.findAll("li")
#lis 변수를 선언하고, ‘mlist2 no_bg’ 에서 li 태그들을
#리스트[ ] 형태로 담으라는 명령
for li in lis:# for 문을 이용해 lis에 있는 li들을 하나씩 꺼내서 출력
   
#print(li)
   
strong = li.find("strong")
   
print(strong)

결과:

 

=> Text 뽑아내기

import bs4
import urllib.request

url =
"https://news.naver.com/"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
, "html.parser")
#print(bs_obj)
mlist2_no_bg = bs_obj.find("ul", {"class": "mlist2 no_bg"})
#bs_obj에서 class ‘mlist2 no_bg’ ul 태그를 찾음
#print(mlist2_no_bg)
lis = mlist2_no_bg.findAll("li")
#lis 변수를 선언하고, ‘mlist2 no_bg’ 에서 li 태그들을
#리스트[ ] 형태로 담으라는 명령
for li in lis:# for 문을 이용해 lis에 있는 li들을 하나씩 꺼내서 출력
   
#print(li)
   
strong = li.find("strong")
   
#print(strong)
   
print(strong.text)

결과:

 

 

 

=>네이버 헤드라인 뉴스

#naver_headlinenews.py
import urllib.request
import bs4
import time
import os
while True:
    url =
"https://news.naver.com/"
   
html = urllib.request.urlopen(url)
    bs_obj = bs4.BeautifulSoup(html
, "html.parser")

    ul = bs_obj.find(
"ul", {"class": "hdline_article_list"})
    div = ul.findAll(
"div", {"class": "hdline_article_tit"})

   
#print(lis)
   
for i in range(0, len(div)):
        a_tag = div[i].find(
"a")
       
print(a_tag.text.strip())

    time.sleep(
5)
    os.system(
"cls")

결과:

 

=>네이버 중간 메뉴 뽑아보기

#naver_menu_middle.py
import urllib.request
import bs4
url =
"https://www.naver.com/"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
, "html.parser")

div = bs_obj.find(
"div", {"class": "rolling-container"})

lis = div.findAll(
"li")
#print(lis)

for i in range(0, len(lis)):
    a_tag = lis[i].find(
"a")
#    span_tag = a_tag.find("span", {"class": "an_txt"})
   
print(a_tag.text)

결과:

 

=>네이버 메뉴 오른쪽

#naver_menu_right.py
import urllib.request
import bs4
url =
"https://www.naver.com/"
html = urllib.request.urlopen(url)

bs_obj = bs4.BeautifulSoup(html
, "html.parser")
ul = bs_obj.find(
"ul", {"id": "PM_ID_serviceNavi"})
lis = ul.findAll(
"li")
#print(lis)
for i in range(0, len(lis)):
    a_tag = lis[i].find(
"a")
    span_tag = a_tag.find(
"span", {"class": "an_txt"})
   
print(span_tag.text)

결과:

 

프로젝트 명 : 뉴스 빅데이터 분석 시스템 구축

1.데이터베이스 구축

데이터베이스 생성 : naverDB

테이블 생성 : news

=>테이블 생성

#db_create.py
import sqlite3

con = sqlite3.connect(
"../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

cur.execute(
"DROP TABLE news")#테이블 있으면 삭제하고 해야 한다.
#
위에것 최초생성시 주석 처리한다.
cur.execute("CREATE TABLE news (div char(10), title char(100), writer char(10))")

con.commit()
con.close()

=>테이블 생성 및 인덱스 생성

#db_create2.py
import sqlite3

con = sqlite3.connect(
"../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

#cur.execute("DROP TABLE news1")
cur.execute("CREATE TABLE news1 (wrdt data,div char(20),title char(100),writer char(20))")
cur.execute(
"create index wrdt on news1 (wrdt)")

con.commit()
con.close()

 

2.네이버 뉴스(정치) 데이터 수집

DB 테이블 저장 : news

파일 저장 : news.txt

#naver_news_db2.py
import urllib.request
import bs4
import time
import sqlite3

## 변수 선언 부분 ##
con, cur = None, None
data1, data2, data3 = "", "", ""
sql = ""

# 메인 코드 부분 ##
while True:
    url =
"http://news.naver.com/"
   
html = urllib.request.urlopen(url)

    bs_obj = bs4.BeautifulSoup(html
, "html.parser")

    hdline_article_list = bs_obj.find(
"ul", {"class":"hdline_article_list"})
    lis = hdline_article_list.findAll(
"li")

    con = sqlite3.connect(
"../sqlite-tools-win32-x86-3300100/naverDB")
    cur = con.cursor()

   
for li in lis:
        a = li.find(
"a")
        a.text.strip()

        data1 =
"정치"  # 뉴스 구분
       
data2 = a.text.strip()
        data2 = data2.replace(
"'", "\"")  # 뉴스 제목
       
data3 = "ydgil"  # 작성자

       
sql = "INSERT INTO news1 VALUES(datetime(), '" + data1 + "', '" + data2 + "', '" + data3 + "')"
       
cur.execute(sql)

    con.commit()
    con.close()
    time.sleep(
3600)

 

==>헤드라인 뉴스 뽑아보기

#naver_news_database.py
import urllib.request
import bs4
import time
import os
import sqlite3

con
, cur = None, None
data1, data2, data3 = "", "", ""
sql = ""

con = sqlite3.connect("../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

while True:
    url =
"https://news.naver.com/"
   
html = urllib.request.urlopen(url)
    bs_obj = bs4.BeautifulSoup(html
, "html.parser")

    ul = bs_obj.find(
"ul", {"class": "hdline_article_list"})
    div = ul.findAll(
"div", {"class": "hdline_article_tit"})

   
# print(lis)

   
for i in range(0, len(div)):
        a_tag = div[i].find(
"a")
       
print(a_tag.text.strip())

        data1 =
"헤드라인"
       
data2 = a_tag.text.strip()
        data2 = data2.replace(
"'","\"")
        data3 =
"SHee28"
        
sql = "INSERT INTO news VALUES('" + data1 + "', '" + data2 + "', '" + data3 + "')"
       
#print(sql)
       
cur.execute(sql)
   
# print(sql)
   

   
con.commit()
    con.close()

   
# time.sleep(5)
    # os.system("cls")

 

3.네이버 뉴스(전체) 데이터 수집

파일 저장 : news.csv

=>전체 뉴스 일기

#naver_news_db.py
import urllib.request
import bs4
import time
import os
import sqlite3

con
, cur = None, None
data1, data2, data3 = "", "", ""
sql = ""

con = sqlite3.connect("../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

while True:
    url =
"https://news.naver.com/"
   
html = urllib.request.urlopen(url)
    bs_obj = bs4.BeautifulSoup(html
, "html.parser")
   
#div = bs_obj.findAll("div",{"class":"mtype_list_wide"})
    #print(div)
   
first_h = bs_obj.find("ul", {"class": "hdline_article_list"})
    lis = first_h.findAll(
"li")
   
# print(lis)

    #
헤드라인 뉴스 검색
   
for i in range(len(lis)):
        a = lis[i].find(
"a")

        data1 =
"헤드라인 뉴스"  # 뉴스 구분
       
data2 = a.text.strip()
        data2 = data2.replace(
"'", "\"")  # 뉴스 제목
       
data3 = "hhh"  # 작성자
       
sql = "INSERT INTO news1 VALUES(datetime('now','localtime'),'" + data1 + "', '" + data2 + "', '" + data3 + "')"
       
print(sql)
        cur.execute(sql)

   
#기타 뉴스 검색
   
first_a_list = bs_obj.findAll("ul",{"class":"mlist2 no_bg"})
    title = bs_obj.findAll(
"h4")#title가져오기

   
for i in range(len(first_a_list)):
        lis = first_a_list[i].findAll(
"li")

       
for li in lis:
            a = li.find(
"a")
            writer= li.find(
"span",{"class":"writing"}).text

            data1 = title[i+
1].text #뉴스 구분
           
data2 = a.text.strip()
            data2 = data2.replace(
"'", "\"")#뉴스 제목
           
data3 = writer#작성자
           
sql = "INSERT INTO news1 VALUES(datetime('now','localtime'),'" + data1 + "', '" + data2 + "', '" + data3 + "')"
           
print(sql)
            cur.execute(sql)

    con.commit()
    con.close()
    time.sleep(
3600)#한시간 마다 들어간다.
    # os.system("cls")

 

=>텍스트 파일 읽기

#naver_news_db_write_file.py
import urllib.request
import bs4
import time
import os
import sqlite3

con
, cur = None, None
data0,data1, data2, data3 ="", "", "", ""
row = None
sql = ""
result = ""
con = sqlite3.connect("../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

cur.execute(
"select * from news1")
f =
open("news.txt",'w')
while True:
    row = cur.fetchone()
   
if row == None:
       
break
   
data0 = row[0]
    data1 = row[
1]
    data2 = row[
2]
    data3 = row[
3]
    result = data0+
"|"+data1+"|"+data2+"|"+data3+"\n"
   
f .write(result)

f.close()

결과:

 

=>csv파일 읽기

#naver_all_urllib.request
import bs4
import time
import os
import sqlite3
import csv

con
, cur = None, None
data0,data1, data2, data3 ="", "", "", ""
row = None
sql = ""
result = ""
con = sqlite3.connect("../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

cur.execute(
"select * from news1")
f =
open("news.csv",'w',encoding="UTF-8")#경로 바꿀 수 있음
list = []

while True:
    row = cur.fetchone()
   
if row == None:
       
break
   
#list = []
    #list.insert(0,row[0])
    #list.insert(1, row[1])
    #list.insert(2, row[2])
    #list.insert(3, row[3])
    #wr = csv.writer(f)
    #wr.writerow(list)
   
result = ""
   
data0 = row[0].strip()
    data1 = row[
1].strip()
    data2 = row[
2].replace(",", ".")
    data3 = row[
3]

    result =
"%s, %s, %s, %s\n" % (data0,data1,data2,data3)
   
print(result)
   
#result = data0+","+ data1+","+data2+","+ data3+"\n"
   
f.write(result)

con.close()
f.close()

결과: utf-8로 해서 오류가 난다.

 

4.뉴스 빅데이터 분석

3번파일 텍스트 마이닝

막대 그래프

워드 클라우드

# datamining.R

rm(data)

#뉴스만 분석 R에서 하기

 

library(ggplot2)

library(dplyr)

library(rJava)

library(memoise)

library(KoNLP)

library(stringr)

library(data.table)

#data <- fread("c:/crawl/news1.csv",header = F,encoding = "UTF-8")#UTF-8

#data <- read.csv("c:/crawl/news1.csv",header = F)

data <- fread("c:/crawl/news1.csv",header = F)

#read.csv원하는 값 이상하게 들어옴

data

head(data)

 

txt <- str_replace_all(data$V3,"//w","")#특수문자 제거

#txt1 <- str_replace_all(data$V3,"\\w","")#특수문자 제거->오류

txt

str(txt)

 

nouns <- extractNoun(txt)

nouns

 

wordCount <- table(unlist(nouns))

wordCount

 

df_word <- as.data.frame(wordCount,stringsAsFactors = F)

df_word  <- rename(df_word,word = Var1,freq =Freq)

df_word <- filter(df_word,nchar(word)>= 2)

top_20 <- df_word %>%

    arrange(desc(freq)) %>%

    head(20)

top_20

 

library(wordcloud)

library(RColorBrewer)

 

pal <- brewer.pal(8,"Dark2")

#pal <- brewer.pal(9,"Blues")[5:9]

#

set.seed(1201)

wordcloud(words= df_word$word,

          freq = df_word$freq,

          min.freq = 2,

          max.words = 200,

          random.order = F,

          rot.per = .1,

          scale = c(4,0.3),

          colors = pal)

#set.seed(1202)

#set.seed(Sys.time())

 

wordcloud(words= df_word$word,

          freq = df_word$freq,

          min.freq = 2,

          max.words = 200,

          random.order = F,

          rot.per = .1,

          scale = c(4,0.3),

          colors = pal)

 

top_20$word

data_y <- top_20$freq

names(data_y) <- top_20$word

barplot(data_y,main="word",ylab="frequency")

 

ggplot(data = top_20,aes(x= word,y = freq,fill=word))+geom_bar(stat = 'identity')

5.다음

=>다움 뉴스

import urllib.request
import bs4
import time
import os
import sqlite3

con
, cur = None, None
data1, data2, data3 = "", "", ""
sql = ""

con = sqlite3.connect("../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

while True:
    url =
"https://media.daum.net/"
   
html = urllib.request.urlopen(url)
    bs_obj = bs4.BeautifulSoup(html
, "html.parser")
    first_div = bs_obj.find(
"div",{"class":"box_headline"})
    first_ul_list = first_div.findAll(
"ul",{"class":"list_headline"})
   
#ul
   
for first_ul in first_ul_list:
       
#li
       
first_li_list = first_ul.findAll("li")
       
for j in range(1,len(first_li_list)):
            strong_tag = first_li_list[j].find(
"strong",{"class":"tit_g"})
            a_tag = strong_tag.find(
"a",{"class":"link_txt"})
            writer = strong_tag.find(
"span", {"class": "info_news"})
           
if a_tag != None:
                data1 =
"daum"  # 뉴스 구분
               
data2 = a_tag.text.strip()
                data2 = data2.replace(
"'", "\"")  # 뉴스 제목
               
data3 = writer.text  # 작성자
               
sql = "INSERT INTO news1 VALUES(datetime('now','localtime'),'" + data1 + "', '" + data2 + "', '" + data3 + "')"
               
print(sql)
                cur.execute(sql)

    con.commit()
    con.close()
    time.sleep(
3600)  # 한시간 마다 들어간다.



=>구글 실패

암호화 등 내용이 많아서

import urllib.request
import bs4
import time
import os
import sqlite3

con
, cur = None, None
data1, data2, data3 = "", "", ""
sql = ""

con = sqlite3.connect("../sqlite-tools-win32-x86-3300100/naverDB")
cur = con.cursor()

while True:
    url =
"https://news.google.com/?hl=ko&tab=rn1&gl=KR&ceid=KR:ko"
   
html = urllib.request.urlopen(url)
    bs_obj = bs4.BeautifulSoup(html
, "html.parser")
    div_list = bs_obj.findAll(
"div",{"class":"xrnccd F6Welf R7GTQ keNKEd j7vNaf"})

    title_list = bs_obj.findAll(
"a",{"class":"wmzpFf"})

   
#ul
   
title=""
   
for i in range(len(div_list)):
       
#li
       
a_list = div_list[i].findAll("a",{"class":"DY5T1d"})
       
for i in range(len(a_list)):
            writer = div_list[i].findAll(
"a",{"class":"wEwyrc AVN2gc uQIVzc Sksgp"})[i]

            data1 =
"google"  # 뉴스 구분
           
data2 = a_list[i].text.strip()
            data2 = data2.replace(
"'", "\"").replace("\u2027","")  # 뉴스 제목
            
print(data2)
            data3 = writer.text 
# 작성자
           
sql = "INSERT INTO news1 VALUES(datetime('now','localtime'),'" + data1 + "', '" + data2 + "', '" + data3 + "')"
           
print(sql)
            cur.execute(sql)


    con.commit()
    con.close()
    time.sleep(
3600)  # 한시간 마다 들어간다.



 

반응형

'Study > Python' 카테고리의 다른 글

python-11  (0) 2020.10.26
python-10  (0) 2020.10.26
python-8  (0) 2020.09.12
Python-7  (0) 2020.09.12
python-6  (0) 2020.09.10
반응형

 

데이터베이스 처리

 

I. 데이터베이스 개념

=>데이터베이스 이해

대량의 데이터가 발생하는 현대 사회에서 데이터베이스를 사용하면 수십억, 수백억 건의 데이터를 저장하고 무리 없이 운영할 수 있음

데이터베이스 소프트웨어(DBMS) - Oracle, SQL Server, MySQL, Access, SQLite

=>데이터베이스 기본 기념

데이터베이스 정의:

대량의 데이터를 체계적으로 저장해 여러 사용자가 서로 공유할 수 있는 시스템

관계형 데이터베이스:

DBMS는 계층형(Hierarchical), 망형(Network), 관계형(Relational), 객체지향형(Object-Oriented), 객체관계형(Object-Relational) 등의 유형으로 나눔

그 중 관계형(Relational) DBMS가 가장 많이 사용됨

=>DBMS 구성도

데이터베이스 객체지향으로 만들면 중복이 될수 있다.

rdb관계형 database\

 

II. 데이터베이스 구축

=>데이터베이스 구축 및 운영 절차

=> 파이썬에서 데이터 입력하는 코딩 순서

 

III. 데이터 입력과 조회

오라클 db 연동을 위한 모듈 다운로드 및 설치 (윈도우 키 + R)

python -m pip install cx_Oracle --upgrade

pip install cx_Oracle

     데이터베이스 연결

오라클을 사용하기 위해 관련 모듈인 cx_Oracle를 임포트한 후, cx_Oracle.connect(‘유저’, ‘비밀번호‘, ‘데이터베이스 서버 주소)으로 데이터베이스와 연결

 

     커서 생성

커서(Cursor)는 데이터베이스에 SQL문을 실행 또는 실행 결과를 돌려받는 통로

에서 연결한 연결자에 커서를 만들어야 함

cur = con.cursor( )

     테이블 만들기

테이블을 만드는 SQL문을 커서이름.execute() 함수의 매개변수로 넘겨주면, SQL문이 데이터베이스에 실행

     데이터 입력

데이터 입력도 SQL문을 사용해야 하므로 커서이름.execute() 함수를 사용

데이터 입력은 필요한 만큼 반복함

     입력한 데이터 저장

④에서 입력한 4건의 데이터는 임시로 저장된 상태임

이를 확실하게 저장하는 것을 커밋(Commit)이라고 함

con.commit( )

     데이터베이스 닫기

con.close( )

 

=>데이터 입력 프로그램 구현

=>파이썬에서 데이터 조회하는 코딩 순서

③에서는 커서에 SELECT로 조회한 결과를 한꺼번에 저장

④에서 조회한 데이터를 한 행씩 fetchone( ) 함수로 접근한 다음 출력

 

=>데이터 조회 프로그램 구현

 

 

2 단계 : 데이터베이스 구축

파일 탐색기에서 sqlite3.exe를 더블 클릭하면 명령 프롬프트가 실행되고, sqlite> 로 프롬프트가 표시됨

 

https://www.sqlite.org/download.html

 

 

 

 

 

 

 

 

 데이터베이스 생성

 

 

 

자주 사용하는 SQLite 명령어

.open : 데이터베이스를 생성하거나 열어줌 데이터베이스 수정

.table : 현재 데이터베이스의 테이블 목록을 보여줌 데이터베이스 수정

.schema 테이블이름 : 테이블의 열 및 데이터 형식 등 정보를 보여줌 schema 테이블 이름

.quit : SQLite 를 종료함

 

.open pythonDB

 

=> 파이썬에서 데이터 입력하는 코딩 순서

 

 

 

 

 

 

 

 

① 데이터베이스 연결

SQLite를 사용하기 위해 관련 모듈인 sqlite3를 임포트한 후, sqlite3.connect(DB 이름”)으로 데이터베이스와 연결

 

import sqlite3

con=sqlite3.connect("C:/sqlite/pythonDB")

 

 

 

② 커서 생성

커서(Cursor)는 데이터베이스에 SQL문을 실행 또는 실행 결과를 돌려받는 통로

에서 연결한 연결자에 커서를 만들어야 함

cur = con.cursor( )

 

 

③ 테이블 만들기

테이블을 만드는 SQL문을 커서이름.execute() 함수의 매개변수로 넘겨주면, SQL문이 데이터베이스에 실행

cur.execute("CREATE TABLE userTable (id char(4), userName char(15), email char(15), birthYear int)")

 

 

④ 데이터 입력

데이터 입력도 SQL문을 사용해야 하므로 커서이름.execute() 함수를 사용

데이터 입력은 필요한 만큼 반복함

cur.execute("INSERT INTO userTable VALUES('john', 'John Bann', 'john@naver.com', 1990)")

cur.execute("INSERT INTO userTable VALUES('kim', 'Kim Chi', 'kim@daum.', 1992)")

cur.execute("INSERT INTO userTable VALUES('lee', 'Lee Pal', 'lee@paran.com', 1988)")

cur.execute("INSERT INTO userTable VALUES('park', 'Park Su', 'park@gmail.com', 1980)")

 

 

 

 

⑤ 입력한 데이터 저장

④에서 입력한 4건의 데이터는 임시로 저장된 상태임

이를 확실하게 저장하는 것을 커밋(Commit)이라고 함

con.commit( )

 

데이터베이스 닫기

con.close( )

 

 

# C:/doit/db_insert.py

import sqlite3

## 변수 선언 부분 ##

con, cur = None, None

data1, data2, data3, data4 = "", "", "", ""

sql = ""

## 메인 코드 부분 ##

con = sqlite3.connect("C:/sqlite/naverDB")

cur = con.cursor()

while (True):

data1 = input("사용자ID ==> ")

if data1 == "":

break;

data2 = input("사용자이름 ==> ")

data3 = input("이메일 ==> ")

data4 = input("출생년도 ==> ")

sql = "INSERT INTO userTable VALUES('" + data1 + "', '" + data2 + "', '" + data3 + "', " + data4 + ")"

cur.execute(sql)

 

 

# C:/doit/db_select.py
import sqlite3
## 변수 선언 부분 ##
con, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
row = None
## 메인 코드 부분 ##
con = sqlite3.connect("C:/sqlite/naverDB")
cur = con.cursor()
cur.execute("SELECT * FROM userTable")
print("사용자ID 사용자이름 이메일 출생연도")
print("--------------------------------------------")
while (True):
row = cur.fetchone()
if row == None:
break;
data1 = row[0]
data2 = row[1]
data3 = row[2]
data4 = row[3]
print("%5s %15s %15s %d" % (data1, data2, data3, data4))
con.close( )

 

 

 

 

 

=> 데이터 입력 프로그램 구현

 

 

파이썬에서 데이터 조회하는 코딩 순서

 

③에서는 커서에 SELECT로 조회한 결과를 한꺼번에 저장

④에서 조회한 데이터를 한 행씩 fetchone( ) 함수로 접근한 다음 출력

 

 

 

 

 

 

=>데이터 조회 프로그램 구현

 

반응형

'Study > Python' 카테고리의 다른 글

python-10  (0) 2020.10.26
Python-9  (0) 2020.09.12
Python-7  (0) 2020.09.12
python-6  (0) 2020.09.10
python-5  (0) 2020.09.09
반응형

7. 정규 표현식

 

I. 정규 표현식 살펴보기

정규 표현식(Regular Expressions) 은 복잡한 문자열을 처리할 때 사용하는 기법으로 문자열을 처리하는 모든 곳에서 사용함

isdigit()는 음수나 소숫점이 포함된 숫자는 False를 리턴한다. 대충 생각해서는 왠지 될 것 같은데 안된다.

정규 표현식은 왜 필요한가?

주민등록번호를 포함하고 있는 텍스트가 있다. 이 텍스트에 포함된 모든 주민등 록번호의 뒷자리를 * 문자로 변경해 보자.

정규식을 모르면, 다음과 같은 순서로 프로그램을 작성해야 할 것임

1. 전체 텍스트를 공백 문자로 나눈다(split).

2. 나뉜 단어가 주민등록번호 형식인지 조사한다.

3. 단어가 주민등록번호 형식이라면 뒷자리를 *로 변환한다.

4. 나뉜 단어를 다시 조립한다.

주민등록번호의 뒷자리를 * 문자로 구현한 코드

data = """

park 800905-1049118

kim  700905-1059119

"""

 

result = []

for line in data.split("\n"):

    word_result = []

    for word in line.split(" "):

        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():

            word = word[:6] +"-" + "******"

        word_result.append(word)

    result.append(" ".join(word_result))

print("\n".join(result))   

 

data = """

park 800905-1049118

kim  700905-1059119

"""

 

result = []

for line in data.split("\n"):

    word_result = []

    for word in line.split(" "):#공백 문자마다 나누기

        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():

            word = word[:6]+"-"+"*******"

        word_result.append(word)

    result.append(" ".join(word_result))#나눈 단어 조립하기

print("\n".join(result))                          

 

 

주민등록번호의 뒷자리를 * 문자로 구현한 정규 표현식

 

import re

pat = re.compile("(\d{6})[-]\d{7}")#class가 만든 객체

#(\d{6})[-]\d{7}자열을 확인

#()->group으로 하기->g1

#\d 숫자인 것을 찾아내라

print(pat.sub("\g<1>-*******",data))#함수 호출

 

###########정규표현식

import re

pat = re.compile("(\d{6})[-]\d{7}")#class가 만든 객체

#(\d{6})[-]\d{7}자열을 확인

#()->group으로 하기->g1

#\d 숫자인 것을 찾아내라

print(pat.sub("\g<1>-*******",data))#함수 호출

 

정규 표현식을 사용하면 훨씬 간편하고 직관적인 코드를 작성할 수 있음

찾으려는 문자열 또는 바꾸어야 할 문자열의 규칙이 매우 복잡하다면, 정규식의 효용은 더 커지게 됨

 

II. 정규 표현식 시작하기

=>정규 표현식의 기초, 메타 문자

 

메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말함

 

==>문자 클래스 [ ]

'[ ] 사이의 문자들과 매치라는 의미를 갖음

하이픈(-)는 두 문자 사이의 범위(From - To)를 의미함

^는 반대(not)를 의미함

[a-zA-Z] :알파벳 모두

[0-9] : 숫자

자주 사용하는 문자 클래스

대문자로 사용된 것은 소문자의 반대임

 

==>Dot(.)

Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미함

a.b “a + 모든 문자 + b” a하고 b사이 한문자

ab사이에 줄 바꿈 문자를 제외한 어떤 문자가 들어가도 모두 매치

a[.]b는 문자 . 그대로를 의미함 (“a + Dot(.)문자 + b”)

이 경우에는 "a.b" 문자열과 매치되고 "a0b" 문자열과는 매치되지 않는다.

 

==>반복(*) 

* 메타 문자는 반복을 의미함. 0부터 무한대로 반복될 수 있음

ca*t * 문자 바로 앞에 있는 a 0번 이상 반복되면 매치

ca*t  a 0번부터 무한 반복

 

==>반복(+) 

+ 메타 문자도 반복을 의미함. 최소 1번 이상 반복될 때 사용함

ca+t “c + a(1번 이상 반복) + t”

 

==>반복({m,n}, ?) 

반복 횟수를 제한하고 싶을 때 사용

{m,n}는 반복 횟수가 m부터 n까지 매치할 수 있음. m 또는 n을 생략할 수도 있음

{m,}는 반복 횟수가 m 이상이고, {,n}는 반복 횟수가 n 이하를 의미함

{1,} +와 동일하고, {0,} *와 동일함

 

1. {m}

ca{2}t a 2번 반복되면 매치, “c + a(반드시 2번 반복) + t”

 

2. {m,n}

ca{2,5}t a 2~5번 반복되면 매치,  “c + a(2~5번 반복) + t”

 

3.?

? 메타 문자는 {0, 1}을 의미함

ab?c b 0~1번 사용되면 매치,  “a + b(있어도 되고 없어도 된다) + c"

*, +, ? 메타 문자는 모두 {m, n} 형태로 고쳐 쓰는 것이 가능하지만, 가급적 간결한 *, +, ? 메타 문자를 사용하는 것이 좋음

 

파이썬에서 정규 표현식을 지원하는 re 모듈

re 모듈은 파이썬 설치할 때 자동으로 설치되는 기본 라이브러리임

>>> import re

>>> p = re.compile('ab*')

re.compile을 사용하여 정규 표현식을 컴파일함

re.compile의 결과로 돌려주는 객체 p (컴파일된 패턴 객체) 를 사용하여 그 이후의 작업을 수행함

 

==>정규식을 사용한 문자열 검색

컴파일된 패턴 객체는 4가지 메소드를 제공함

match() 문자열의 처음부터 정규식과 매치되는지 조사함

처음부분

search() 문자열 전체를 검색하여 정규식과 매치되는지 조사함

어디 있는 지 관계없다.

findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려줌

객체로 돌려주면 class

findall은 함수이다.

finditer() 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려줌

match, search는 정규식과 매치될 때는 match 객체를 돌려주고, 매치되지 않을 때는 None을 돌려줌

 

#########match

>>> import re

>>> p = re.compile('[a-z]+')

>>> m = p.match("python")

>>> print(m)

>>> m = p.match("3 python")

>>> print(m)

match의 결과로 객체 또는 None 을 돌려주기 때문에 다음의 흐름으로 작성함

 

 

 

 

 

###########[]

#+최소한 한번 와야 한다 match

data=('python','3 python')

p = re.compile('[a-z]+')

for i in data:

    m = p.match(i)

    #print(m)

    #<re.Match object; span=(0, 6), match='python'>

    #None

    if m:

        print("Match Found match: ",m.group())

        print("Match Found match: ",m.start())

        print("Match Found match: ",m.end())

        print("Match Found match: ",m.span())

    else:

        print("No match match")

 

#########search

문자열 전체를 검색하여 정규식과 매치되는지 조사함

>>> import re

>>> p = re.compile('[a-z]+')

>>> m = p.search("python")

>>> print(m)

>>> m = p.search("3 python")

>>> print(m)

문자열 전체를 검색하기 때문에 “3” 이후의 “python” 문자열과 매치됨

 

for i in data:

    m = p.search(i)

    #print(m)

    #<re.Match object; span=(0, 6), match='python'>

    #<re.Match object; span=(2, 8), match='python'>

   

    if m:

        print("Match Found search: ",m.group())

    else:

        print("No match search")

 

#########findall

정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려줌

>>> import re

>>> p = re.compile('[a-z]+')

>>> result = p.findall("life is too short")

>>> print(result)

result = p.findall("life1 is tooA short")

print(result)

#print(result[0])

 

#########finditer

정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려줌

>>> result = p.finditer("life is too short")

>>> print(result)

>>> for r in result:print(r)

result = p.finditer("life is too short")

#print(result)#<callable_iterator object at 0x000002CE171C4CA0>

for i in result:

    print(i.group())

 

===> match, search 객체의 메소드

어떤 문자열이 매치되었는가?

매치된 문자열의 인덱스는 어디부터 어디까지인가?

 

match, search 객체의 메소드 사용 예:

>>> import re

>>> p = re.compile('[a-z]+')

>>> m = p.match("python")

>>> m.start()

>>> m.end()

>>> m.span()

>>> m = p.search("3 python")

>>> m.start()

>>> m.end()

>>> m.span()

         

메소드 결과값이 다르게 나오는 것을 확인할 수 있음

 

==>[모듈 단위로 수행하기]

re 모듈은 축약된 형태로 사용할 수 있는 방법을 제공함

이 방식은 잘 사용하지 않는다. 메소드를 다양하게 사용해야 하는데

이것은 한번밖에 사용 안 된다.

#m = re.match(patten,string)

 

 

 

한 번 만든 패턴 객체를 여러 번 사용해야 할 때는 re.compile을 사용하는 것이 좋음

 

=>컴파일 옵션

DOTALL            S         dot 문자(.)가 줄바꿈 문자를 포함하여 모든 문자와 매치함

IGNORECASE     I          · 소문자에 관계 없이 매치함

MULTILINE         M        여러 줄과 매치함 (^, $ 메타 문자의 사용과 관계가 있는 옵션임

각 라인의 처음 ^           각 라인의 마지막 $

VERBOSE          X         verbose 모드를 사용함 (정규식을 보기 편하게 만들 수도 있고, 주석 등을 사용할 수도 있음)

verbose  주석을 다라 주는 것

 

==> DOTALL, S

dot 문자(.)가 줄바꿈 문자(\n)를 포함하여 모든 문자와 매치함

re.DATALL 또는 re.S 옵션을 사용해 정규식을 컴파일하면 됨

>>> import re

>>> p = re.compile('a.b')

>>> m = p.match('a\nb')

>>> print(m)     # 문자열과 정규식이 매치되지 않음

 

>>> p = re.compile('a.b',re.DOTALL)

>>> m = p.match('a\nb')

>>> print(m)

 

>>> p = re.compile('a.b',re.S)

>>> m = p.match('a\nb')

>>> print(m)

 

==> IGNORECASE, I

re.IGNORECASE 또는 re.I 옵션은 대 · 소문자에 관계 없이 매치함

>>> p = re.compile('[a-z]',re.I)

>>> p.match('python')

<re.Match object; span=(0, 1), match='p'>

>>> p.match('Python')

<re.Match object; span=(0, 1), match='P'>

>>> p.match('PYTHON')

<re.Match object; span=(0, 1), match='P'>

 

==> MULTILINE, M

re.MULTILINE 또는 re.M 옵션은 메타 문자인 ^, $와 연관된 옵션임

^는 문자열의 처음을 의미하고, $은 문자열의 마지막을 의미함

>>> import re

>>> p = re.compile("^python\s\w+")

>>> data = """python one

life is too short

python two

you need python

python three"""

>>> print(p.findall(data))

['python one']

 

re.MULTILINE 또는 re.M 옵션은 ^, $ 를 문자열의 각 줄마다 적용해 주는 것임

>>> import re

>>> p = re.compile("^python\s\w+",re.MULTILINE)

>>> data = """python one

life is too short

python two

you need python

python three"""

>>> print(p.findall(data))

['python one', 'python two', 'python three']

 

 

==> VERBOSE, X

re.VERBOSE 또는 re.X 옵션은 정규식을 보기 편하게 주석 또는 줄 단위로 구분 할 수도 있음

 

 

 

 

 

 

 

 

문자열에 사용된 whitespace는 컴파일할 때 제거됨([ ]안은 제외)

줄 단위로 #기호를 사용하여 주석문을 작성할 수 있음

 

=> 백슬래시 문제

\section”와 같이 \ 문자가 포함된 문자열을 찾을 때 혼란을 줌

\section

\s 문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않음

[ \t\n\r\f\v]ection 도 동일하게 whitespace로 해석됨

정규식에서 사용한 \ 문자가 문자열 자체임을 알려 주기 위해 백슬래시 2개를 사용하여 이스케이프 처리를 해야 함

>>> p = re.compile('\\section')

>>> p = re.compile('\\\\section')

\를 사용한 표현이 너무 복잡하여 Raw String 규칙이 생겨나게 됨

>>> p = re.compile(r'\\section')

정규식 문자열 앞에 r 문자를 삽입하면, Raw String 규칙에 의하여 백슬래시 2개 대신 1개만 써도 2개를 쓴 것과 동일한 의미를 갖게 됨

 

import re

p = re.compile('\\section')

print(p.match('\section'))

#None

 

p = re.compile('\\\\section')

print(p.match('\section'))

#<re.Match object; span=(0, 8), match='\\section'>

 

#\를 사용한 표현이 너무 복잡하여 Raw String 규칙이 생겨나게 됨

p = re.compile(r'\\section')

print(p.match('\section'))

#<re.Match object; span=(0, 8), match='\\section'>

 

III. 강력한 정규 표현식의 세계로

그룹(Group)을 만드는 법, 전방 탐색 등 강력한 정규 표현식을 살펴봄

=>메타 문자

+, *, [], {} 등의 메타 문자는 매치가 진행될 때 매치되고 있는 문자열의 위치가 변경되지만 (소비된다고 표현) , 문자열을 소비시키지 않는 메타 문자도 있음

 

==>|

| 메타 문자는 or과 동일한 의미로 사용됨

>>> p = re.compile('Crow|Servo')

>>> m = p.match('CrowHello')

>>> print(m)

<re.Match object; span=(0, 4), match='Crow'>

 

==>^

^ 메타 문자는 문자열의 맨 처음과 일치함을 의미함

>>> print(re.search('^Life','Life is too short'))

<re.Match object; span=(0, 4), match='Life'>

>>> print(re.search('^Life','MyLife'))

None

 

p = re.compile('^Life')

print(p.search('Life is too short'))

#<re.Match object; span=(0, 4), match='Life'>

re 모듈의 축약된 형태

re.MULTILINE을 사용할 경우에는 여러 줄의 문자열일 때 각 줄의 처음과 일치함

 

==>$

$ 메타 문자는 문자열의 끝과 매치함을 의미함

>>> print(re.search('short$','Life is too short'))

<re.Match object; span=(12, 17), match='short'>

>>> print(re.search('short$','Life is too short,you need python'))

None

 

p = re.compile('short$')

print(p.search('Life is too short'))

#<re.Match object; span=(12, 17), match='short'>

 

==>\A 

\A는 문자열의 처음과 매치됨을 의미함

\A는 줄과 상관없이 전체 문자열의 처음하고만 매치됨

==>\Z 

\Z는 문자열의 끝과 매치됨을 의미함

\Z는 줄과 상관없이 전체 문자열의 끝과 매치됨

 

==>\b 

\b는 단어 구분자(Word boundary)이며, 단어는 whitespace에 의해 구분됨

>>> p = re.compile(r'\bclass\b')

>>>

>>> print(p.search('no class at all'))

<re.Match object; span=(3, 8), match='class'>

>>> print(p.search('the declassified algorithm'))

None

>>> print(p.search('one subclass is'))

None

\b는 파이썬 리터럴 규칙에 의하면 백스페이스(BackSpace)를 의미하므로, 구분자임을 알려 주기 위해 r’\bclass\b’처럼 Raw string임을 알려주는 기호r을 반드시 붙여 주어야 함

 

==>\B

\b의 반대로, \B whitespace로 구분된 단어가 아닌 경우에만 매치됨

>>> p = re.compile(r'\Bclass\B')

>>>

>>> print(p.search('no class at all'))

None

>>> print(p.search('the declassified algorithm'))

<re.Match object; span=(6, 11), match='class'>

>>> print(p.search('one subclass is'))

None

class 단어의 앞뒤에 whitespace가 하나라도 있는 경우에는 매치가 안됨

 

==>그루핑

ABC 문자열이 계속해서 반복되는지 조사하는 정규식을 작성하고 싶을 때 사용됨

: (ABC)+

>>> p = re.compile('(ABC)+')

>>> m = p.search('ABCABCABC OK?')

>>> print(m)

<re.Match object; span=(0, 9), match='ABCABCABC'>

>>> print(m.group())

ABCABCABC

 

\w+\s+\d+[-]\d+[-]\d+’이름 + “ “ + 전화번호형태의 문자열을 찾는 정규식

\w+\s+\d+[-]\d+[-]\d+

\w 문자 숫자

\s white space

>>> p = re.compile(r"\w+\s+\d+[-]\d+[-]\d+")

>>> m = p.search("park 010-1234-1234")

그룹핑하고이름부분만 뽑아내기

>>> p = re.compile(r"(\w+)\s+\d+[-]\d+[-]\d+")

>>> m = p.search("park 010-1234-1234")

>>> print(m.group(1))

park

이름에 해당하는 ‘\w+’ 부분을 그룹 ‘(\w+)’으로 만들면, match 객체의 group(인덱스) 메소드를 사용하여 그루핑된 부분의 문자열만 뽑아낼 수 있음

 

==>‘전화번호’ 부분만 뽑아내기

>>> p = re.compile(r"(\w+)\s+(\d+[-]\d+[-]\d+)")

>>> m = p.search("park 010-1234-1234")

>>> print(m.group(2))

010-1234-1234

 

==>‘국번’ 부분만 뽑아내기

>>> p = re.compile(r"(\w+)\s+((\d+)[-]\d+[-]\d+)")

>>> m = p.search("park 010-1234-1234")

>>> print(m.group(3))

010

그룹이 중첩되어 있는 경우는 바깥쪽부터 시작하여 안쪽으로 들어갈수록 인덱스가 증가함

 

 

==>그루핑된 문자열 재참조하기

>>> p = re.compile(r'(\b\w+)\s+\1')

>>> p.search('Paris in the the spring').group()

'the the'

정규식 ‘(\b\w+)\s+\1’ ‘(그룹) + “ “ + 그룹과 동일한 단어와 매치됨을 의미

2개의 동일한 단어를 연속적으로 사용해야만 매치됨

\1은 정규식의 그룹 중 첫 번째 그룹을 가리키고, \2는 두 번째 그룹을 참조함

\1 한번더 쓰라  첫번때 그룹 재창조 하고 싶을때 \1

두번째 그룹 \2

 

=>그루핑된 문자열에 이름 붙이기

정규식 안에 그룹이 많고 그룹이 추가 및 삭제되면, 그 그룹을 인덱스로 참조한 프로그램도 모두 변경해 주어야 하는 위험이 있음

이러한 이유로 그룹 이름을 지정할 수 있게 했음

(?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)

그룹에 이름을 지어 주려면, (\w+)  (?P<name>\w+) 변경하면 됨

>>> p = re.compile(r'(?P<name>\b\w+)\s+((\d+)[-]\d+[-]\d+)')

>>> m = p.search("park 010-1234-1234")

>>> print(m.group("name"))

park

print(m.group("name"))print(m.group(1)) 결과는 같다.

name이라는 그룹 이름으로 참조할 수 있음

>>> p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)')

>>> p.search('Paris in the the spring').group()

'the the'

그룹 이름도 정규식 안에서 재참조할 때는 (?P=그룹이름) 확장 구분을 사용함

 

=>전방 탐색

[.] ->새파일.txt .표현

#긍정형 전방 탐색

>>> p = re.compile(".+:")

>>> m = p.search("http://google.com")

>>> print(m.group())

http:

?=: : 으로 제외하는데 :이것으로 끝내는 것 찾기

.+:”과 일치하는 문자열로 http:를 돌려줌

http:라는 검색 결과에서 :을 제외하고 싶을 때, 전방 탐색임

==>긍정형 전방 탐색

>>> p = re.compile(".+(?=:)")

>>> m = p.search("http://google.com")

>>> print(m.group())

http

http:라는 검색 결과에서 :을 제외하고 돌려줌

 

==>부정형 전방 탐색

확장자가 bat가 아닌 경우에만 통과된다는 의미임

확장자가 bat 또는 exe가 아닌 경우에는 통과된다는 의미임

p = re.compile(".*[.](?!bat$).*$")

#.* -> * 0번부터

#bat 가 아닌 것을

m = p.search("aa.exe")

print(m)

 

p = re.compile(".*[.](?!bat$|exe$).*$")

#.* -> * 0번부터

#bat 가 아닌 것을

#[.] 실제 점을 찍고 싶을 때

m = p.search("aa.txt")

print(m)

 

=>문자열 바꾸기

sub 메소드를 사용하면 정규식과 매치되는 부분을 다른 문자로 쉽게 바꿀 수 있음

>>> p = re.compile('(blue|white|red)')

>>> p.sub('colour','blue socks and red shoes')

'colour socks and colour shoes'

위에 색상을 colore를 바꾸기

sub 메소드의 첫 번째 매개변수는바꿀 문자열이 되고, 두 번째 매개변수는 ‘대상 문자열이 됨

바꾸기 횟수를 제어하려면, 세 번째 매개변수로 count 값을 넘기면 됨

===>한번 만 바꾸기

>>> p.sub('colour','blue socks and red shoes',count=1)

'colour socks and red shoes'

===>count를 해서 바꾸기

print(p.sub('colour','blue socks and red shoes',count = 2))

colour socks and colour shoes

print(p.sub('colour','blue socks and red shoes',count = 3))

colour socks and colour shoes

 

==>sub 메소드와 유사한 subn 메소드

>>> p = re.compile('(blue|white|red)')

>>> p.subn('colour','blue socks and red shoes')

('colour socks and colour shoes', 2)

 

==>sub 메소드를 사용할 때 참조 구문 사용하기

>>> p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")

>>> print(p.sub("\g<phone> \g<name>","park 010-1234-1234"))

010-1234-1234 park

‘\g<그룹 이름>’을 사용하면 정규식의 그룹 이름을 참조할 수 있게 됨

>>> p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")

>>> print(p.sub("\g<2> \g<1>","park 010-1234-1234"))

010-1234-1234 park

 

==>sub 메소드의 매개변수로 함수 넣기

>>> def hexrepl(match):

    value = int(match.group())

    return hex(value)

 

>>> p = re.compile(r'\d+')

>>> p.sub(hexrepl,'Call 65490 for printing, 49152 for user code.')

'Call 0xffd2 for printing, 0xc000 for user code.'

 

=>Greedy vs Non-Greedy

#print(re.match('<.*>', s).span())

#<. 문한 >

#*->? ?표를 0아니면 1번 나오게 하라

>>> s = '<html><head><title>Title</title>'

>>> len(s)

32

>>> print(re.match('<.*>',s).span())

(0, 32)

>>> print(re.match('<.*>',s).group())

<html><head><title>Title</title>

‘<.*>’ 정규식의 매치 결과로 * 메타 문자는 탐욕스러워서(Greedy) 최대한의 문자열을 모두 소비해 버림

 

>>> print(re.match('<.*?>',s).group())

<html>

non-greedy 문자인 ? *?, +?, ??, {m,n}?와 같이 사용할 수 있음

 

 

 

연습문제

1.

>>> a = "a:b:c:d"

>>> b = a.split(":")

>>> print("#".join(b))

a#b#c#d

 

2.

>>> a = {'A':90,'B':80}

>>> a['C']

Traceback (most recent call last):

  File "<pyshell#77>", line 1, in <module>

    a['C']

KeyError: 'C'

===========================>

>>> a = {'A':90,'B':80}

>>> a.get('C',70)

70

 

3.

>>> a = [1,2,3]

>>> a = a + [4,5]

>>> a

[1, 2, 3, 4, 5]

>>> a = [1,2,3]

>>> a.extend([4,5])

>>> a

[1, 2, 3, 4, 5]

id로 구분한다.

>>> a = [1,2,3]

>>> id(a)

1353827821696

>>> a = a + [4,5]

>>> id(a)

1353827491904

>>> a = [1,2,3]

>>> id(a)

1353827822336

>>> a.extend([4,5])

>>> id(a)

1353827822336

 

 

 

 

4.

A= [20,55,67,82,45,33,90,87,100,25]

sum = 0

for i in A:

    if i >= 50:

       sum += i

print(sum)#481

 

5.

def fibo1(n):

    if n == 0 : return 0

    elif n == 1: return 1

    else:

        return fibo1(n-1) +fibo1(n-2)

 

for i in range(10):

print(fibo1(i))

 

6.

user_input = input("숫자를 입력하여 주십시요.")

# 65,45,2,3,45,8

user_input = user_input.split(",")

sum = 0

for i in user_input:

    sum += int(i)

print(sum)

 

7.

user_input = int(input("숫자를 입력하여 주십시요."))

for i in range(1,10):

print(i * user_input,end =" ")

 

8.

f = open("abc.txt",'r')

lines = f.readlines()

f.close()

 

lines.reverse()

 

f = open("abc.txt",'w')

for line in lines:

    line = line.strip()

    f.write(line)

    f.write('\n')

f.close()

 

9.

f = open("sample.txt",'r')

lines = f.readlines()

f.close()

 

f = open("result.txt",'w')

sum = 0

for i in lines:

    sum += int(i)

f.write(str(sum/len(lines)))

f.close()

 

10.

>>> class Calculator():

    def __init__(self,numberlist):

        self.numberlist = numberlist

    def sum(self):

        result = 0

        for num in self.numberlist:

            result += num

        return result

    def avg(self):

        total = self.sum()

        return total/len(self.numberlist)

 

>>> cal1 = Calculator([1,2,3,4,5])

>>> cal1.sum()

15

>>> cal1.avg()

3.0

>>> cal2 = Calculator([6,7,8,9,10])

>>> cal2.sum()

40

>>> cal2.avg()

8.0

 

11.

>>> import sys

>>> sys.path.append("c:\doit")

>>> import mymod

 

12.

>>> result = 0

>>> try:

    [1,2,3][3]

    "a"+1

    4 / 0

except TypeError:

    result += 1

except ZeroDivisionError:

    result += 1

except IndexError:

    result += 1

finally:

    result += 4

 

   

>>> print(result)

5

 

 

13.

>>> a = "4546793"

>>> import re

>>> pat = re.compile("(\d{3})(\d{2})(\d{1})(\d{1})")

>>> print(pat.sub("\g<1>-*\g<2>-\g<3>-\g<4>",a))

454-*67-9-3

 

14.

문자열 압축하기

>>> def compress_string(s):

    _c = ""

    cnt = 0

    result =""

    for c in s:

        if c!= _c:

            _c = c

            if cnt :result += str(cnt)

            result += c

            cnt = 1

        else:

            cnt +=1

    if cnt : result += str(cnt)

    return result

 

>>> print(compress_string("aaabbcccccca"))

a3b2c6a1

 

15.

>>> def chkDupNum(s):

    result = []

    for num in s:

        if num not in result:

            result.append(s)

        else:

            return false

    return len(result) == 10

 

>>> print(chkDupNum("0123456789"))

True

>>> print(chkDupNum("01234"))

False

>>> print(chkDupNum("01234567890"))

False

>>> print(chkDupNum("6789012345"))

True

>>> print(chkDupNum("012322456789"))

False

 

16.

>>> dic = {".-":"A","-...":"B","-.-.":"C","-..":"D",".":"E","..-.":"F","--.":"G"

       ,"....":"H","I":"..",".---":"J","-.-":"K",".-..":"L","--":"M","-.":"N"

       ,"---":"O",".--.":"P","--.-":"Q",".-.":"R","...":"S","-":"T"

       ,"..-":"U","...-":"V",".--":"W","-..-":"X","-.--":"Y","--..":"Z"}

>>> def morse(src):

    result = []

    for word in src.split(" "):

        for char in word.split(" "):

            result.append(dic[char])

        result.append(" ")

    return "".join(result)

 

>>> print(morse(".... ... .-.. . . .--. ... . .- .-.. -.--"))

H S L E E P S E A L Y

 

17.

>>> import re

>>> p = re.compile("a[.]{3,}b")

>>> print(p.search("acccb"))

None

>>> print(p.search("a....b"))

<re.Match object; span=(0, 6), match='a....b'>

>>> print(p.search("aaab"))

None

>>> print(p.search("a.cccb"))

None

 

18.

>>> import re

>>> p = re.compile("[a-z]+")

>>> m = p.search("5 python")

>>> m.start()+m.end()

10

>>> m.start()

2

>>> m.end()

8

 

19.

>>> data = """

park 010-9999-9988

kim 010-9909-7789

lee 010-8789-7768

"""

>>> import re

>>> p = re.compile("(\d{3}[-]+\d{4}[-])\d{4}")

>>> print(p.sub(r"\g<1>-####",data))

 

park 010-9999--####

kim 010-9909--####

lee 010-8789--####

 

20.

>>> import re

>>> pat = re.compile(".*[@].*[.](?=com$|net$).*$")

>>> print(pat.match("pankey@gmail.com"))

<re.Match object; span=(0, 16), match='pankey@gmail.com'>

>>> print(pat.match("kim@daum.com"))

<re.Match object; span=(0, 12), match='kim@daum.com'>

>>> print(pat.match("lee@myhome.com"))

<re.Match object; span=(0, 14), match='lee@myhome.com'>

반응형

'Study > Python' 카테고리의 다른 글

Python-9  (0) 2020.09.12
python-8  (0) 2020.09.12
python-6  (0) 2020.09.10
python-5  (0) 2020.09.09
python-4  (0) 2020.09.08

+ Recent posts