Python | file, web

🛟 Dive.·2024년 3월 7일
0

Python

목록 보기
19/22

파일 시스템 : 파일, 디렉토리

윈도우에서는 디렉토리라는 용어 대신 폴더라고 사용함.

  • 디렉토리 : 파일을 담는 또 하나의 파일, 여러 파일을 포함 할 수 있는 그릇.

파일의 종류.

  • 바이너리 파일 : 컴퓨터만 이해할 수 있는 형태인 이진 형식으로 저장된 파일. (메모장 X)
  • 텍스트 파일 : 사람도 이해할 수 있는 형태인 문자열 형식 저장.(메모장 O)

파일 읽기.

open() 함수 사용.
f = open('파일명','r')
f.close()
  • r : 읽기 모드.
  • w : 쓰기 모드.
  • a : 추가 모드.

파일 읽기 : 여러가지 방법.

  1. read()함수.
f.read()
  1. with 문.
with open('.    ','r') as my_file:
	contents = 	my_file.read()
	print(contents)
  1. 한줄씩 읽기 : readline() 함수.
with open('.    ','r') as my_file:
	contents = 	my_file.readline()

파일 쓰기 : ‘w’, ‘a’.

  • w : 텍스트 파일 저장하기 위해 텍스트 파일을 저장할 때 사용하는 표준 encoding 사용.
  • a : 상황에 따라 파일을 계속 추가해야 하는 작업이 있을 수도 있으므로, 기존 파일에 추가 작업을 해야할 때 사용.

디렉토리 생성.

import os
os.mkdir('text')

디렉토리 생성 : 폴더의 존재 여부 판단 후에 생성.

if not os.path.isdir('text'):
	os.mkdir()

pickle 모듈.

메모리에 로딩된 객체를 영속화할 수 있도록 지원.

import pickle

f = open('list.pickle','wb')
test = [1,2,3,4,5]
pickle.dump(test.f)
f.close()

웹스크래핑.

웹의 개념.

월드 와이드 웹은 인터넷에 연결된 컴퓨터를 이용하여 사람들과 정보를 공유할 수 있도록 거미줄 처럼 엮인 공간.

데이터 송수신을 위해 HTTP 프로토콜 사용.

데이터를 표시하기 위해 HTML 형식 사용.

  • HTML : 웹상의 정보를 구조적으로 표현하기 위한 언어.
<title>Hello. World </title>

→ 태그는 < > 로 둘러싸여 있고, 그 안에 정보에 대한 의미를 적음.

  • HTTP

인터넷에서 컴퓨터 간에 정보를 주고받을 때 사용하는 일종의 약속을 말함.

웹의 동작 순서.

http://www.domain.com:1234/path/to/resource?a=b&x=y
  • http : 프로토콜.
  • www.domain.com : 호스트.
  • 1234 : 포트.
  • path/to/resource : 리소스 path.
  • a = b & x = y : 쿼리.

웹의 동작 순서.

  1. 요청 : 웹 주소, form, header 등.
  2. 처리 : database 처리 등 요청 대응.
  3. 응답 : HTML, XML 등으로 결과 반환.
  4. 렌더링 : HTML, XML 표시.

웹 스크래핑.

  • 모든 웹은 HTML로 구성, HTML의 규칙을 파악한다면 얼마든지 HTML에서 필요한 정보를 가져올 수 있음.
  • 웹 스크래핑(web scrapping)

HTML 데이터 다루기.

import urllib
url = '         '
fname, header = urllib.request,urlretrieve(url, '....')
  • urlretrieve : urlretrieve(url 호출, 다운로드할 파일명)

HTML 파싱.

  • 웹 페이지의 HTML을 분석하여 데이터를 추출하는 작업.
  • 특정 텍스트를 분석하여 그 데이터로 부터 필요한 정보 추출.

정규 표현식.

  • 정규 표현식은 일종의 문자를 표현하는 공식으로, 특정 규칙이 있는 문자열 집합을 추출할 때 자주 사용하는 기법.
  • 정규 표현식, regexp, regex 불림.
010-0000-0000^\d{3}-\d{4}-\d{4}$
203.252.101.40^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$
  • 메타문자 : 문자를 설명하기 위하 문자, 문자의 구성을 설명하기 위해 기존의 의미가 아닌 다른 의미로 쓰인 문자.

메타문자 : [ ]

  • 대괄호 [ ] 는 [ 와 ] 사이의 문자와 매칭하라는 뜻.
  • ex : [a-zA-Z]나[가-힣]와 같은 기호로 문자열에서 알파벳과 한글을 추출 가능.
  • [0-9]에서 숫자 추출 가능.

메타문자 : 휴대전화번호.

[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]
[0-9]+-[0-9]+-[0-9]+
[0-9]{3}-[0-9]{3,4}-[0-9]{4}
  • | : or의 의미.
  • ^ : not의 의미.
  • ^ $ : 시작과 끝에 붙임.

실습 내용.

import re
import urllib.request as url

url1 = '   '
html = url.urlopen(url1)
html_cont = str(html.read())
id_result = re.findall("([A-Za-z0-9]+\*\*\*)", html_cont)

XML, JSON

Data 저장 방식.

  • CSV : Comma reparate Values.
  • HTML : 웹사이트의 모습을 기술하기 위한 마크업 언어.
  • XML
  • JSON

XML 의 개념.

XML은 확장적인 마크업 언어라는 뜻, 데이터의 구조와 의미를 설명하는 태그를 사용하여 어떤 데이터의 속성과 값을 표현하는 언어.

시작 태그와 종료 태그 사이에 값이 있고, 그 값은 태그의 이름으로 만들어진 속성에 대한 값.

정보의 구조에 대한 정보인 스키마와 DTD 등으로 정보에 대한 정보가 표현.

용도에 따라 다양한 형태로 변형 가능.

컴퓨터 간에 정보를 주고 받기 위한 유용한 저장 방식.

XML 파싱.

BeautifulSoup 모듈 사용법.

  • 객체생성
soup = BeautufulSoup(books_xml,'lxml')
  • xml 문서를 분석하는 새로운 객체를 생성.
  • 태그검색.
soup.find_all('author')
  • 필요한 태그를 검색하여 여러 개를 반환하는 함수.

JSON.

  • javascript Object Notation. 의 개념.

    • 원래 웹 언어인 Java script의 데이터 객체 표현 방식
    • JSON은 XML 보다 데이터 용량이 적고 코드로의 전환이 쉽다는 측면에서 XML의 대체로 가장 많이 사용.
    • 파이썬의 딕셔너리 자료형과 비슷. : key - value 값으로 구성.
  • xml과 비교할때 JSON의 장점.

  1. 간결한 코드.
  2. 쉬운 코드의 전환.
  3. 코드의 간결함 때문에 용량의 절약(가장 큰 장점.)

JSON 모듈을 사용하여 손 쉽게 파싱 및 저장 가능.

  • Python은 기본적으로 JSON 표준 라이브러리 제공.
import json
  • JSON 라이브러리를 사용하여 Python 타입의 Object를 JSON 문자열로 변경할 수 있다.(JSON 인코딩).
  • JSON 문자열을 다시 Pyhton 타입으로 변환할 수 있음.(JSON 디코딩)

데이터 저장 및 읽기는 dict type과 상호 호환 가능.

웹에서 제공하는 API는 대부분 정보 교환 시 JSON 활용.

페이스북, 트위터, github 등 거의 모든 사이트.

각 사이트 마다 Developer API의 활용법을 찾아 사용.

Python 데이터 시각화.

import matplotlib.pyplot as plt

plt.plot([1,2,3,4]) # x값 자동 완성.
plt.xlabel('y-label')
plt.show()
import matplotlib.pyplot as plt
plt.plot([1,2,3,4],[1,4,9,16]) # x, y 지정.
plt.xlabel('x-label')
plt.ylabel('y-label')
plt.show()
import matplotlib.pyplot as plt
plt.plot([1,2,3,4],[1,4,9,16]) # x, y 지정.
plt.xlabel('x-label')
plt.ylabel('y-label')
plt.axis([0, 5, 0, 20])
plt.show()
  • 마커 형태 지정.
import matplotlib.pyplot as plt
plt.plot([1,2,3,4],[1,4,9,16], 'bo') # x, y 지정.
plt.xlabel('x-label')
plt.ylabel('y-label')
plt.axis([0, 5, 0, 20])
plt.show()
  • 그래프 선 색 지정.
import matplotlib.pyplot as plt
plt.plot([1,2,3,4],[1,4,9,16], 'r')
plt.plot([1,2,3,4],[1,4,9,16], 'violet') # x, y 지정.
plt.xlabel('x-label')
plt.ylabel('y-label')
plt.axis([0, 5, 0, 20])
plt.show()
  • 스타일 지정.
import matpplotlib.pyplot as plt

plt.plot([1,2,3,4], [1,4,9,16], 'ro')
plt.axis([0, 6, 0, 20])
plt.show()
  • 여러 개의 그래프 그리기.
  • matplotlib 에서는 일반적으로 numpy 어레이를 이용.
  • numpy 어레이를 사용하지 않더라도 모든 시퀀스는 내부적으로 numpy 어레이로 변환.
import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0., 5., 0.2)
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
  • matplotlib 그래프 영역 채우기.
    • 그래프의 특정 영역을 색상으로 채워서 강조.
      • fill_between()
      • fill_betweenx()
      • fill()
import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [1,4,9,16]

plt.plot(x, y)
plt.xlabel('X-label')
plt.ylabel('y-label')
plt.fill_between(x[1:3], y[1:3], alpha = 0.5)

plt.show()
  • 두 그래프 사이 영역 채우기.
import matplotlib.pyplot as plt

x = [1,2,3,4]
y1 = [1,4,9,16]
y2 = [1,2,4,8]

plt.plot(x, y1)
plt.plot(x, y2)
plt.xlabel('X-label')
plt.ylabel('y-label')
plt.fill_between(x[1:3], y1[1:3], y2[1:3],color = 'lightgray' ,alpha = 0.5)

plt.show()
  • 임의의 영역 채우기.
import matplotlib.pyplot as plt

x = [1,2,3,4]
y1 = [1,4,9,16]
y2 = [1,2,4,8]

plt.plot(x, y1)
plt.plot(x, y2)
plt.xlabel('X-label')
plt.ylabel('y-label')
plt.fill([1.9, 1.9, 3.1, 3.1], [2, 5, 11, 8],
color = 'lightgray', alpha = 0.5)

plt.show()
  • matplotlib.pyplot 모듈의 xticks(), yticks(), tick_params() 함수.
import matplot.pyplot as plt
import numpy as np

a = np.arnage(0, 2, 0.2)

plt.plot(a, a, 'bo')
plt.plot(a, a**2, color = 'red', marker = '*', linewidth = 2)
plt.plot(a, a**3, color = 'springgreen', marker = '^', markersize = 9)
plt.xticks([0, 1, 2])
plt.yticks(np.arange(1, 6))

pt.show()
  • 그래프 제목 지정.
plt.title(’Title test’)
  • 막대 그래프 스타일 지정.
plt.bar(x, values, width = 0.6,
				align = 'edge', color = 'springgreen',
				edgecolor = 'gray', linewidth = 3,
				tick_label = years, log = True)
  • width : 막대 너비
  • align : 틱과 막대의 위치 조절, ‘center’, ‘edge’
  • color : 막대의 색 지정.
  • edgecolor : 막대의 테두리 색 지정.
  • linewidth : 테두리의 두께 지정.
  • tick_label : 어레이 형태로 지정, 틱에 어레이의 문자열을 순서대로 나타낼 수 있음.
  • log = True : y축이 로그 스케일로 표시.

  • 산점도(scatter.)
plt.scatter(x, y, s = area, c = colors, alpha = 0.5)
plt.show()

  • 히스토그램.
plt.hist()

histtype = 'step'
histtype = 'stepfilled'
histtype = 'step'

  • 에러바.
plt.errorbar(x, y, yerr = yerr)
plt.show()

  • 파이차트.
plt.pie(ratio, labels = labels, autopct = '%.1f%%',
		startangle = 260, counterclock = False, explode = explode,
		shadow = True, colors = colors)

plt.show()

데이터 베이스.

  • 데이터베이스 - 데이터를 일정한 형태로 저장해 놓은 것.
    • 통합된 데이터
    • 저장된 데이터
    • 운영 데이터
    • 공용 데이터
  • 데이터베이스 특성.
    • 실시간 접근성
    • 내용에 의한 참조
    • 동시 공유
    • 계속적 변화

데이터 베이스 만들기.

import sqlite3

def getConn():
	conn = sqlte3.connect('c:/workspace/test.db')
	return conn
  • DB 파일 만들기.
import libs.db.db1 import getConn

defg create_table():
conn = getConn()
cur = conn.cursor()
cur.execute('''
	create .....
''')
	conn.commit()
	conn.close()

Numpy.

  1. 리스트 vs 넘파이.
  • 리스트는 여러 개의 값들을 저장할 수 있는 자료구조 → 리스트는 다양한 자료형의 데이터를 여러 개 저장할 수 있으며 데이터를 변경하거나 추가, 제거, 할 수 있다.
  • 하지만 데이터 과학에서는 파이썬의 기본 리스트로 충분하지 않음.
    • → 리스트는 연산 기능이 부족하며 연산 속도도 빠르지 않음.
  • 따라서 데이터 과학자들은 기본 리스트 대신에 넘파이 선호.

  • 넘파이는 대용량의 배열과 행렬 연산을 빠르게 수행, 고차원적인 수학 연산자와 함수를 포함하고 있는 파이썬 라이브러리.
  • 넘파이의 배열은 주황색으로 표시된 파이썬의 리스트에 비해 처리속도가 매우 빠름을 알 수 있음.
  • 넘파이의 핵심적인 객체는 다차원 배열.

넘파이 장점.

  • why 넘파이.
  • 넘파이는 성능이 우수한 ndarray 객체 제공.
  • ndarray의 장점.
    • C 언어에 기반한 배열 구조 → 메모리를 적게 사용하고 속도가 빠름.
    • 배열과 배열 간에 수학적인 연산을 적용할 수 있다.
    • 고급 연산자와 풍부한 함수들을 제공.

넘파이의 연산.

R 벡터 형식의 연산처럼 이루어 짐.(이렇게 생각하면 쉬움.)

  • ndim : 배열 축 혹은 차원의 개수.
  • shape : 배열의 차원으로 튜플 형.
  • size : 배열 원소의 개수.
  • dtype : 배열 내의 원소의 형을 기술하는 객체.
  • itemsize : 배열 내의 원소의 크기를 바읕 단위로 기술.
  • data : 배열의 실제 원소를 포함하고 있는 버퍼.
  • stride : 배열 각 차원별로 다음 요소로 점프하는 데에 필요한 거리를 바이트로 표시한 값을 모은 튜플.

인덱싱, 슬라이싱.

일반적인 슬라이싱, 인덱싱 이랑 같음.


2차원 배열의 인덱싱.

np_array = np.array([[1,2,3], [4,5,6], [7,8,9]])
np_array[0, 2]
3

2차원 배열의 추출.

np.array[1, 1:3]

LAB.

import numpy as np

mat_b = np.array([[10, 20, 30],[10,20,30]])
mat_c = np.array([[2,2,2],[1,2,3]])

print(mat_b - mat_c)

player = np.array([[170, 76.4],
                    [183, 86.2],
                    [181, 78.5],
                    [176, 80.1]])

for i in range(4):
    if player[i, 1] >= 80:
        print(player[i, 1])


넘파이 함수들.

  • np.zeros()
  • np.full()
  • np.eye()
  • np.add()
  • np.substract()
  • np.mulyply()
  • np.divide()
  • np.dot()
  • np.sum(), np.prod()
  • ndarray.shape()
  • np.argmax()
  • np.argmin()
  • np.reshape()
  • np.transpose()
  • np.random.seed()
  • np.random.randn()
  • np.rnadom.randint()

linspace() 함수, logspace() 함수.

  • linspace(0, 10, 100) 함수 : 0 ~ 10 까지의 100개의 수들로 생성.

reshape()함수.

reshape(3, 4)

# 3행 4열로 변경.

flatten() 함수.

  • 2차원 배열을 1차원 배열로 만들어 줌.

상관계수 함수.

np.corrcoef()
profile
Data Science. DevOps.

0개의 댓글