일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Uipath 기초
- 네이버매물크롤링
- pywinauto 윈도우
- UiPath
- Selenium 셀렉터잡기
- uipath 입문
- 네이버 로그인 캡챠해결
- 네이버부동산크롤링
- pywinauto 윈도우제어
- 네이버 로그인 영수증 해결
- Python
- 파이썬 네이버 로그인
- Uipath 설치방법
- 왕초보 파이썬 실행
- selenium
- pycdc.exe
- 파이썬네이버부동산
- 날짜 정규식
- 네이버커머스API
- 파이썬 환경설정
- 파이썬 가상환경 설치방법
- pywinauto
- 네이버 로그인 하기
- 가상환경설치
- Element is not clickable at point
- 파이썬 가상환경 설치
- venv 설치
- pycdas.exe
- vscode venv 설치
- 커머스API
- Today
- Total
목록프로그래밍 (348)
콘솔워크
# dict list 중복 key 제거 def remove_duplicates(lst, key): seen = set() result = [] for d in lst: if d[key] not in seen: seen.add(d[key]) result.append(d) return result
import re phone_number = '010-1234-5678' pattern = r'^01[016789]-\d{3,4}-\d{4}$' if re.search(pattern, phone_number): print("휴대전화 번호의 양식에 맞습니다.") else: print("휴대전화 번호의 양식에 맞지 않습니다.") 011을 사용하던 시절의 휴대전화번호도 인식 가능하다.
wait(driver, 70).until( EC.invisibility_of_element_located((By.CSS_SELECTOR, 'img[src="/image/admin/webpubs-load.gif"]')) ) 로딩이미지가 사라질때까지 대기하는 코드이다.
origin_num_list = ['1', '2', '3'] num_1 = '1' num_2 = '2' other_num_list = [num for num in origin_num_list if num != num_1 and num != num_2] print(other_num_list) origin_num_list = ['1', '2', '3'] num_1 = '1' num_2 = '2' other_num_list = list(set(origin_num_list) - set([num_1, num_2])) print(other_num_list) 각각 용도에 맞게 사용
github에 push 후에 해당 정보를 pull 받고 바로 서버를 재기동 하는 script를 만들었다. 리눅스에 git이 설치되어있어야하고 git 전역 config에 미리 값이 등록되어 있어야한다. touch .gitconfig git config --global user.name [계정명] git config --global user.email [계정이메일] git config --global --list git clone https://github.com/[github주소]/[appname-api] username >> 계정 입력 Password >> 계정의 Settings >> Developer settings >> Personal access tokens의 토큰값 입력 github의 action..
import clipboard data = {'id':'아이디', 'pw':'비밀번호'} clipboard.copy(str(data)) 너무 길어서 확인하기 힘든 dict형태의 자료를 다른 파일에 옮겨서 확인할 때 꽤 쓸만한 기능이다.
def switch_to_screen(self): driver: webdriver.Chrome = self.driver url = '이동할 url' # 창을 여는 javascript, 새 창에서 열리게 된다. driver.execute_script(f"window.open('{url}')") time.sleep(1) # driver.window_handles tabs = driver.window_handles # 새 창이 열리지 않았다면 작업 실패 if len(tabs) == 1: raise Exception("새 창에 진입하지 못했습니다.") # 새 창이 열렸다면 기존 창을 닫고 tab 전환 try: driver.close() except Exception as e: print(str(e)) final..
=> SSH 연결이 끊어져도 서버가 계속 실행되는 방법을 알아보았다. 명령어 실행 >> python manage.py runserver 0:8000 >> ctrl + z >> bg >> disown -h python manage.py runserver 0:8000 장고 서버를 구동시킨다. ctrl + z 해당 프로그램을 정지시키고 shell로 돌아온다. bg 명령어를 쳐서 백그라운드에서 보낸다. disown -h ssh 연결이 끊어져도 해당 프로세스가 돌아가도록 한다. 터미널 창을 종료한다. 재접속의 경우 >> sudo lsof -t -i tcp:8000 | xargs kill -9 실행 중인 프로세스 확인 >> ps -l 🐶 리눅스 프로세스 관련 개념 백 그라운드(Back Ground) 시간이 오래 ..
pyside6로만 개발하다가 이제 django를 활용해서 개발을 진행하고자한다. 기존에 개발되어있는 것을 일단 git clone 한다. 일단 django 개발은 3.11버전으로 진행할 예정이라 내 로컬에 default로 깔려있던 3.8.7 버전말고 3.11버전으로 실행해주어야 했다. py -3.11 -m pip install poetry 이렇게 하면 3.11버전의 파이썬에 poetry 설치가 된다. poetry를 처음부터 사용하려면 poetry init으로 프로젝트를 만들면 되지만 나는 기존에 있던 것을 사용할 것이다. 먼저 poetry의 env 가상환경을 3.11버전으로 맞춰준다. poetry env use C:\Users\consolework\AppData\Local\Programs\Python\Py..
pip install xmltodict 설치가 필요하다. import xmltodict import json xml_string = 'John30' # XML 문자열을 딕셔너리로 변환 data_dict = xmltodict.parse(xml_string) # 딕셔너리를 JSON 형식으로 변환 json_data = json.dumps(data_dict) print(json_data)
pyside6로 파이썬 에디터를 사용하면서 사용자가 특정 글자수를 입력하면, 글자수를 표시해주는 기능을 개발하였다. 중요한 포인트는 keyReleaseEvent에 키이벤트 처리함수를 입력해주어야한다. O keyPressedEvent에 매칭시키면 안된다. X self.input_sentence_textedit = QPlainTextEdit() self.input_sentence_textedit.keyReleaseEvent = self.on_input_sentence_textedit_keyReleaseEvent 이벤트처리는 다음과 같이 하면된다. def on_input_sentence_textedit_keyReleaseEvent(self, event): text = self.input_sentence_tex..
def get_word_count_without_empty(text:str) -> int: nospace = re.sub(' | |\t|\r|\n', '', text) return nospace 문자열을 파라미터로 넣으면 공백이 제거된 문자열을 반환한다.
프로그램을 최초 실행했을 때, 로그인화면으로 접속해서 id와 pw를 입력받고, 맞으면 다음화면, 아니면 해당 화면에 남아있게 짜봤습니다. id, pw 부분은 각자의 데이터베이스에 맞게 수정해주세요. if 1 == 1: import sys import warnings import os sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))) warnings.simplefilter("ignore", UserWarning) sys.coinit_flags = 2 from tkinter import * from PySide6.QtCore import * from PySide6.QtGui import * from PySide6.QtWi..
pyqt5에서 pyside6로 변경작업을 하던중 Q테이블의 열컬럼 크기가 안맞는 경우가 있었다. tablewidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Fixed) 위와 같이 "setSectionResizeMode"를 사용해서 수정하라고 나와있었는데 근본적인 해결책이 아니었다. 삽질 끝에 찾아낸 방법은, 마지막 열크기에 맞춰서 열 사이즈를 맞추는 것이다. tablewidget.horizontalHeader().setStretchLastSection(True)
패키지 설치합니다. pip install openpyxl 특정 엑셀에 B열에 있는 셀서식을 모두 숫자형식으로 바꾸고 싶었습니다. 그래서 아래와 같은 코드가 탄생했습니다. from openpyxl import Workbook, load_workbook from openpyxl.styles import numbers from openpyxl import Workbook excel = r"C:\Users\consolework\Downloads\엑셀합치기결과_20230602163911.xlsx" # Load the workbook workbook = load_workbook(excel) sheet = workbook.active # Change the format of cells from B2 to the en..
패키지 설치합니다. pip install pandas 한 폴더 내의 엑셀들을 하나로 합치는 기능을 담은 class 입니다. import os import pandas as pd from datetime import datetime class ExcelWorkFeature: def __init__(self) -> None: pass # 폴더 내의 엑셀을 합치기 def combine_excel(self, folder_path: str) -> None: # folder_path : 엑셀 파일 경로 print(folder_path) # 폴더 내 모든 엑셀 파일 경로 가져오기 excel_files = [f for f in os.listdir(folder_path) if f.endswith(".xlsx")] exc..
파이썬으로 웹자동화를 구현할 때 vscode나 파이참에서 직접 실행하고 디버그 해봐야지만 그 동작이 되는지 파악하시나요? 그러면 개발시간이 오래걸립니다. 보통 CSS_SELECTOR 기반으로 셀렉터 잡을때는 크롬 브라우저 콘솔창에서 document.querySelector 이용해서 찾습니다. 하지만 태그에 포함되어있는 텍스트 기반 찾을 때는 xpath를 사용하면 편리한데요. 문제는 xpath를 크롬에서 직접 디버그 할 수 있지 않을까 찾던중 방법을 알아냈습니다. 방법은 $x() 함수를 사용하면됩니다. $x('//div[@class="row"][.//label[text()="검색수"]]//input') $x('//td[contains(@class, "PagerTotal")]/div') $x('//input..
beautifulsoup4 라이브러리를 설치한다. pip install beautifulsoup4 from bs4 import BeautifulSoup html_file = r"__test__\article_sample.html" page = open(html_file, "rt", encoding="utf-8").read() # HTML 파일 읽고 문자열 리턴 soup = BeautifulSoup(page, "html.parser") # Soup 객체 생성 # div와 p 두 종류가 있음 for div in soup.find_all(["div", "p"]): print(div) beautifulsoup4 라이브러리를 사용하면 html을 쉽게 파싱할 수 있다. fild_all 함수를 이용하여 원하는 태그만..
https://extrememanual.net/37073 윈도우10 갑자기 재부팅되는 현상 해결 방법 - 익스트림 매뉴얼 윈도우를 사용하다가 갑자기 재부팅이 되는 경우가 있는데요. https://itons.net/%EC%9C%88%EB%8F%84%EC%9A%B010-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B6%80%ED%8C%85-%EC%8B%9C%EA%B0%84-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
규칙 1. 주의 시작은 월요일이다. 2. 월~일 까지 중 월이 다른 경우 어느 월을 선택할지 기준은 더 많은 쪽을 선택하면 된다. 3. 따라서, 더 많은 쪽을 나누는 기준은 "목요일"이다. 예를들어, 위의 규칙으로 2023년 5월 30일은 몇주차 일까? 6월 1주차일까 5월 5주차일까? 정답은 6월 1주차이다. 왜냐하면 목요일이 6월달이기 때문이다. from datetime import datetime, date, timedelta import lunardate import calendar import numpy as np last_day_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] leap_year_last_day_of_month = [31..
pip install random_user_agent #!/usr/bin/env python if 1 == 1: import sys import os sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))) from random_user_agent.user_agent import UserAgent from random_user_agent.params import SoftwareName, OperatingSystem class RandomUserAgentTest: def __init__(self): self.get_headers() print(self.headers) def set_user_agent(self): softwar..
from enum import Enum class Color(Enum): RED = 1 GREEN = 2 BLUE = 3 my_color = 'RED' color = getattr(Color, my_color) print(color) # Color.RED getattr() 함수를 사용하여 문자열로 표현된 Enum 멤버를 가져오는 방법
사실 파이썬은 interface 를 단어 그 자체로서 존재하고 지원하는 언어는 아닙니다. 다만, https://peps.python.org/pep-3119/ 를 읽어보면 알 수 있듯이 추상 메서드와 같은 인터페이스 비슷한 문법을 제공합니다. python 웹 스크래퍼 작성 중, 필히 구현되어야 하는 메서드들을 한데 묶어두고 관리해야 할 필요성을 느껴 인터페이스를 만들게 되었습니다. ( - 사실 best practice 인지는 모르겠습니다.) from abc import ABC, abstractmethod class BaseScrapper(ABC): """ 모든 스크래퍼의 기본 스크래퍼입니다. 해당 클래스를 상속받는 클래스는 아래의 메서드를 필수로 구현해야 합니다. """ @abstractmethod def..
기본적으로 변경할 때, PyQt5로 되어있는 import만 PySide6로 변경하면 바로 사용이 가능하지만, 몇가지 손을 봐야하는 경우가 있음. # PyQt5 cp = QDesktopWidget().availableGeometry().center() # Pyside6 cp = QGuiApplication.primaryScreen().availableGeometry().center() # PyQt5 @pyqtSlot() # Pyside6 @Slot() # PyQt5 pyqtSignal() # Pyside6 Signal() 시그널 및 슬롯의 구문을 그대로 사용하는 것은 가능하지만, import 해야하는 구문이 달라지기 때문에 그에 맞게 변환해주어야 작동한다. # PyQt5 from PyQt5.QtCore i..
app = Flask(__name__) app.config['JSON_AS_ASCII'] = False 반환은 이런 식으로~~ data = dict( # whatever you want man.. ) return jsonify(data)
import pandas as pd df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank'], 'age': [25, 28, 30, 25, 23, 28], 'city': ['Seoul', 'New York', 'Seoul', 'Paris', 'Seoul', 'New York']}) df_grouped = df.groupby('city').agg(list) print(df_grouped) city열의 정보가 같은 행을 따로 모아서 df_grouped를 새로 만들었다.
def get_df_filtered(self, df_result: pd.DataFrame): query_string = f"(열1 > {변수1}) and (열2 > {변수2}) or (열3 > {변수3}) not (열4 > {변수4})" print(f"query_string: {query_string}") df_filtered = df_result.query(query_string) return df_filtered 비교 연산자, 논리 연산자와 같은 연산자를 변수로 받아와서 사용하는 것도 가능하기 때문에 df.loc[]보다 유용하게 사용할 수 있다.
chrome_options = Options() chrome_options.add_argument("--headless") driver = webdriver.Chrome(options=chrome_options) 아래와 같이 응용할 수도 있겠습니다. def create_driver(): chrome_options = Options() chrome_options.add_argument("--headless") return webdriver.Chrome(options=chrome_options) #################### # example useage...# #################### driver = create_driver() driver.get("bla bla bla...") # d..
num_list = ['1', '2', '3', '4', '5'] num_sum = sum(map(int, num_list)) print(num_sum) # 출력 결과: 15 빠름
import pandas as pd # 샘플 데이터프레임 생성 df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8], 'C': [9, 10, 11, 12]}) # 값이 일치하는 열이 있는 행 검색 search_value = 2 # 검색할 값 search_column = 'A' # 검색할 열 result = df.loc[df[search_column] == search_value] print(result) 위와 같이 검색을 한다면 A열이 2인 행, 즉 1행을 출력하게 된다.