python
-
[Flask] 간단한 로그인 구현 (HTML, GET) 2023.01.20 -
[Python] 클래스에서 다른 클래스 값 가져오기, 변경하기 2023.01.13 -
[Python] 리스트 안 딕셔너리 다루기 2023.01.05 -
[Python] 날짜에서 요일 가져오기 2023.01.04
-
[Python] 문자열이 한 글자들로 이루어졌는지 확인하기 2022.12.29
-
[Python] 튜플을 문자열로 변환하기 2022.12.27 -
[Python] 변수 타입 조건문 2022.12.22
-
[Numpy, Scipy] np.array, toarray() 차이 2022.12.16
[Flask] 간단한 로그인 구현 (HTML, GET)
로그인을 할 수 있는 간단한 form을 보자.
<form action="/login" method="get">
<p>Enter Name:</p>
<p><input type="text" name="user_name" /></p>
<p><input type="submit" value="submit" /></p>
</form>
- method : HTTP method를 의미하고 여기서는 GET을 사용
- action : 버튼이나 입력을 했을 때 가고 싶은 페이지(특정 파일, 라우팅 경로)를 입력하면 됨
- name : 위 코드에서 보면 입력한 값이 user_name의 값으로 저장 됨
- input의 type이 submit이면 버튼이 생성됨
- 버튼을 누르면 위에서 입력한 변수 값(user_name)이 정해진 URL(action 값)로 전달 됨
- 최종 URL은 '현재 HTML페이지가 실행중인 URL/login?user_name=Sso' (method를 GET으로 지정했기 때문)
실제로 구현해보자.
test.html
html:5 입력 후 tab을 누르면 기본 HTML5 템플릿이 생성됨
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인 TEST</title>
</head>
<body>
<form method="get" action="http://localhost:8080/login">
<center>
<h1>로그인</h1>
ID : <input type="text" name="id" /> <br />
PWD : <input type="text" name="pwd" /> <br />
<input type="submit" />
</center>
</form>
</body>
</html>

VScode에서 Live Server를 설치한 후 오른쪽 하단에 생기는 Go Live를 클릭하면 작성한 HTML을 실시간으로 수정해가며 확인할 수 있다.

Go Live를 클릭하여 실행 후 위와 같이 사용중인 포트 번호가 나온다.
이는 별도의 서버(Live Server)를 만들어서 해당 포트(5500)에 HTML을 보여주도록 한 것이다.
위 HTML 코드 설명에서 action이 /login일 경우 127.0.0.1:5500/login으로 가게될 것이다.
하지만 이 서버에는 HTML을 출력하기 위한 것으로 login 라우팅 경로가 있는 것이 아니다!
action에 전체 URL을 적지 않은 경우 해당 HTML 파일을 띄운 서버에 + 라우팅 경로가 된다.
따라서 다른 서버로 이동하기 위해 웹 서버를 띄울 login_test.py 파일을 보자.
login_test.py
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/login')
def login():
id = request.args.get('id')
pwd = request.args.get('pwd')
if id == 'Sso':
return_data = {'auth': 'success'}
else:
return_data = {'auth': 'failed'}
return jsonify(return_data)
if __name__ == '__main__':
app.run(host="127.0.0.1", port="8080")
여기서는 웹서버를 127.0.0.1:8080으로 띄웠고, /login 라우팅 처리를 해줬기 때문에
위 HTML action에서 '/login'이 아닌 'http://localhost:8080/login' 로 적어줘야 한다.
현재는 Live Server와 login_test.py에서 띄운 서버가 총 두개 떠져 있는 것이다!
Live Server에서 띄운 HTML에
id : Sso , pwd : 1234을 입력하고 전송해봤다.

위와 같은 결과가 출력된다.
위 URL을 보면 /login?id=Sso&pwd=1234로 전달 됨을 알 수 있다.
'WebFramework > [Flask]' 카테고리의 다른 글
| [Flask] Jinja2 사용법 (0) | 2023.01.20 |
|---|---|
| [Flask] Bootstrap 사용하기 (로그인) (0) | 2023.01.20 |
| [Flask] GET 사용법 (0) | 2023.01.20 |
| [Flask] httpi 설치 (0) | 2023.01.20 |
| [Flask] 정적, 동적 페이지 라우팅 (1) | 2023.01.19 |
[Python] 클래스에서 다른 클래스 값 가져오기, 변경하기
class A:
def __init__(self):
self.a = 3
def get_a(self):
return self.a
a = A()
a_num = print('A 클래스에서 a 가져오기 : ', a.get_a())
class B:
def change_a(self):
a_num = a.get_a()
print('B 클래스에서 A클래스의 a 가져오기 : ', a_num)
a_num = 5
print('B 클래스에서 A클래스의 a값 바꾸기 : ', a_num)
b = B()
b.change_a()
print('A 클래스에서 a 가져오기 : ', a.get_a())

class A:
def __init__(self):
self.a = 3
def get_a(self):
return self.a
a = A()
a_num = print('A 클래스에서 a 가져오기 : ', a.get_a())
class B:
a_num = a.get_a()
def change_a(self):
print('B 클래스에서 A클래스의 a 가져오기 : ', B.a_num)
B.a_num = 5
print('B 클래스에서 A클래스의 a값 바꾸기 : ', B.a_num)
b = B()
b.change_a()
print('A 클래스에서 a 가져오기 : ', a.get_a())

'업무 > 메모' 카테고리의 다른 글
| [Python] 이모지 제거 (0) | 2023.02.08 |
|---|---|
| sanic 오류 (python, pip 버전 문제) (0) | 2023.01.31 |
| [Python] 리스트 안 딕셔너리 다루기 (0) | 2023.01.05 |
| [Python] 날짜에서 요일 가져오기 (0) | 2023.01.04 |
| [Python] 문자열이 한 글자들로 이루어졌는지 확인하기 (0) | 2022.12.29 |
[Python] 리스트 안 딕셔너리 다루기
현재 다루는 데이터 구조는 아래와 같다.

리스트 > 딕셔너리 > 리스트 > 딕셔너리 구조이다.
for index, value in enumerate(docs):
print(index, value)

위에 코드 처럼 반목문을 돌려 다루고 있다.
docs[index]['data']와 같이 접근할 수 있다.
값을 변경할 일이 많은데 똑같은 실수를 반복해서 남겨놓고자 한다.
for index, value in enumerate(docs):
value = 1
print(docs)

value의 값을 변경한 후 docs를 출력해보자 바뀌지 않은 값이 출력 된다.
당연하지만 docs를 직접 바꿔야된다.
for index, value in enumerate(docs):
docs[index] = 1
print(docs)

'data' 안에 '사번' : 4 를 추가하고 싶다면 아래 처럼 하면 된다.
for index, value in enumerate(docs):
for i, v in enumerate(value['data']):
docs[index]['data'][i]['사번'] = 4
print(docs)

'업무 > 메모' 카테고리의 다른 글
| sanic 오류 (python, pip 버전 문제) (0) | 2023.01.31 |
|---|---|
| [Python] 클래스에서 다른 클래스 값 가져오기, 변경하기 (0) | 2023.01.13 |
| [Python] 날짜에서 요일 가져오기 (0) | 2023.01.04 |
| [Python] 문자열이 한 글자들로 이루어졌는지 확인하기 (0) | 2022.12.29 |
| [Python] 튜플을 문자열로 변환하기 (0) | 2022.12.27 |
[Python] 날짜에서 요일 가져오기
from datetime import datetime
weekday_dic = {
'Monday' : '월요일',
'Tuesday' : '화요일',
'Wednesday' : '수요일',
'Thursday' : '목요일',
'Friday' : '금요일',
'Saturday' : '토요일',
'Sunday' : '일요일'
}
doc = '20230104'
weekday = weekday_dic[datetime(year=int(doc[:4]), month=int(doc[4:6]), day=int(doc[6:8])).strftime('%A')]
print(weekday)
수요일
datetime 객체로 바꿔줘야 가능하다.
.strftime('%A')를 사용하면 Monday, Tuesday, ... 으로 나오기 때문에 딕셔너리를 만들어서 바꿔주었다.
'업무 > 메모' 카테고리의 다른 글
| [Python] 클래스에서 다른 클래스 값 가져오기, 변경하기 (0) | 2023.01.13 |
|---|---|
| [Python] 리스트 안 딕셔너리 다루기 (0) | 2023.01.05 |
| [Python] 문자열이 한 글자들로 이루어졌는지 확인하기 (0) | 2022.12.29 |
| [Python] 튜플을 문자열로 변환하기 (0) | 2022.12.27 |
| [Python] 변수 타입 조건문 (0) | 2022.12.22 |
[Python] 문자열이 한 글자들로 이루어졌는지 확인하기
지난 글 확인 : https://sso-y.tistory.com/39
[NLP] CounVectorizer
문장 from sklearn.feature_extraction.text import CountVectorizer sent = ['도미노 멀티 플렉스 극장 관람료 인상', '관계자 영화산업 생존', '경쟁업계 극장 가격 인상 동참', '직장인 주말 영화 예매 인기 매진 상
sso-y.tistory.com
CountVectorizer에 넘길 문장에 한 글자, 빈 문자열로만 이루어진 리스트를 넘기면 오류가 발생했었다.
한 글자, 빈 문자열로만 이루어진 리스트를 무시하기 위해 아래와 같은 코드를 사용했다.
# 빈 문장 제외, 한자리 문자열만 있는 문장 제외
if len(sent) != 0 or ' ' in sent.strip():
sent = sent.strip()
temp = sent.replace(' ', '')
if len(sent) != len(temp)*2-1:
# CountVectorizer에 sent 전달
CountVectorizer에 넘길 문자열 리스트인 sent의 왼쪽과 오른쪽의 공백을 strip()으로 지워준 후,
모든 띄어쓰기를 제거한 문자열을 temp에 저장했다.
예를 들어
['가 나 다 라 마 ']라는 데이터가 들어왔을 경우
- '가 나 다 라 마' = sent (9 len)
- '가나다라마' = temp (5 len)
- len(temp)*2-1이 len(sent)와 같으면 한 글자로만 이루어진 문자열이다.
더 좋은 방법이 있을 것 같지만..
'업무 > 메모' 카테고리의 다른 글
| [Python] 리스트 안 딕셔너리 다루기 (0) | 2023.01.05 |
|---|---|
| [Python] 날짜에서 요일 가져오기 (0) | 2023.01.04 |
| [Python] 튜플을 문자열로 변환하기 (0) | 2022.12.27 |
| [Python] 변수 타입 조건문 (0) | 2022.12.22 |
| [Python] XlsxWriter 모듈 (0) | 2022.12.12 |
[Python] 튜플을 문자열로 변환하기
n-gram을 테스트 하다가 튜플 안 문자들을 합치는 게 필요했다.
방법은 다음과 같다.
word = ' '.join(('오늘', '날씨'))
print(word)
>> 오늘 날씨
여러 n-gram을 테스트하기 위해 word1과 word2를 나누고 등장 횟수를 구하는 함수에 사용할 예정이다.
test = '안녕하세요 오늘은 십이월 이십칠일 화요일 오후 두시 십일분 날씨는 영상 이도입니다'
text = test.split()
def ngram(num):
for c in list(zip(*[text[i:] for i in range(num)])):
word1 = c[0]
word2 = ' '.join(c[1:])
print('1 : ', word1)
print('2 : ',word2)
print('3gram')
ngram(3)

'업무 > 메모' 카테고리의 다른 글
| [Python] 날짜에서 요일 가져오기 (0) | 2023.01.04 |
|---|---|
| [Python] 문자열이 한 글자들로 이루어졌는지 확인하기 (0) | 2022.12.29 |
| [Python] 변수 타입 조건문 (0) | 2022.12.22 |
| [Python] XlsxWriter 모듈 (0) | 2022.12.12 |
| [Python] os.walk() UTF-8 오류 (0) | 2022.12.12 |
[Python] 변수 타입 조건문
if str(type(sentence)) == "<class 'str'>":
pass
변수의 type을 확인하려면 type(변수)를 사용하면된다.
이를 조건문에 사용할 경우 str()으로 바꿔준 후 type(변수)의 출력(문자열)과 같은지 비교해야 한다.
if type(var) == type([]):
print('var은 list입니다.)'업무 > 메모' 카테고리의 다른 글
| [Python] 날짜에서 요일 가져오기 (0) | 2023.01.04 |
|---|---|
| [Python] 문자열이 한 글자들로 이루어졌는지 확인하기 (0) | 2022.12.29 |
| [Python] 튜플을 문자열로 변환하기 (0) | 2022.12.27 |
| [Python] XlsxWriter 모듈 (0) | 2022.12.12 |
| [Python] os.walk() UTF-8 오류 (0) | 2022.12.12 |
[Numpy, Scipy] np.array, toarray() 차이
from sklearn.feature_extraction.text import CountVectorizer
sent = ['안녕', '감사', '연말', '편지', '눈사람']
vectorizer = CountVectorizer()
bow_vec = vectorizer.fit_transform(sent)
print(type(bow_vec))
# <class 'scipy.sparse.csr.csr_matrix'>
Bow를 테스트해보다가 문득 toarray()와 np.array()의 차이점이 궁금해졌다.
평소 array를 만들 때의 코드는 아래와 같다.
li = [[[1, 2, 3], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
arr = np.array(li)
np.array와 toarray()의 사용법을 보면 차이점을 알 수 있다.
- np.array(__array__ 메서드가 배열을 반환하는 객체 또는 (중첩된) 시퀀스)
- csr_matrix.toarray()


차이점이 뭘까라는 의문이 든 것 자체가 이상하다.
sort()와 sorted()의 차이점이라면 모를까..!!
array()는 numpy 라이브러리의 메서드이며,
toarray()는 scipy 라이브러리의 메서드이다.
궁금증이 생겼다면 numpy와 scipy 라이브러이의 차이점이 궁금했어야 했다..
(사용법에만 급급하지 말자..!)
해당 변수에 type을 출력해보면 <class 'numpy.ndarray'>와 <class 'scipy.sparse.csr.csr_matrix'>이다.
numpy.org와 scipy.org에서 각 메서드와 사용법을 찾아볼 수 있다.


두 메서드 모두 numpy.ndarray를 반환하지만 어떤 객체를 array로 변환할지의 차이다.
csr_matrix가 __array__메서드가 배열을 반환하는 객체 또는 시퀀스인지 확인하는 방법을 모르겠다..!!!!!
우선 np.array()에 csr_matrix를 넘겨봤다.
아래 코드에서 bow_vec의 type은 <class 'scipy.sparse.csr.csr_matrix'> 이다.
na = np.array(bow_vec)
ta = bow_vec.toarray()
print(type(na))
print('***** np.array(metrix) *****')
print(na)
print(type(ta))
print('***** metrix.toarray() *****')
print(ta)

값이 다르다.
배열은 반복가능하므로 각각을 for문을 실행해보자.
for i in na:
print(i)

iteration over a 0-d array 오류가 발생한다.
0-d array 는 0차원의 배열을 의미한다.
즉, 스칼라다.
배열을 반환하긴 하는데 결국 스칼라다..
Stackoverflow에도 numpy의 0d 배열이 스칼라로 간주되지 않는 이유를 묻는 질문이 있었고
이에 대한 답변엔 어렵게 생각하면 안된다. 정신건강에 좋지 않다는 답변과 수학적으로 같지만 다른 코드로 처리된다는 답이 있었다.
(해당글 : https://stackoverflow.com/questions/773030/why-are-0d-arrays-in-numpy-not-considered-scalar)
csr_matrix.toarray()의 반환값을 반복해보자.
for i in ta:
print(i)

역시 잘 출력된다.
'ML > Numpy' 카테고리의 다른 글
| [Numpy] argsort() 사용법 (0) | 2023.01.10 |
|---|---|
| [Numpy] 스칼라, 벡터, 행렬, 텐서 차이 (0) | 2022.12.16 |
| [Numpy] 넘파이 배열(np.array) (0) | 2022.11.09 |