Python - Path / ConnectDB
이 페이지는 다음에 대한 공부 기록입니다
JAVA(자바), Python(파이썬) 기반의
AI 활용 응용 소프트웨어 개발자 양성 과정
2021.11.10. ~ 2022.05.18.
찾으시는 정보가 있으시다면
주제별reference를 이용하시거나
우측 상단에 있는 검색기능을 이용해주세요
76일차 수업
========복습========
함수 : def
클래스 : 멤버변수와 메소드(def)
모듈
함수나 클래스들로 이루어진 .py 파일
모듈은 동시에 시작점이 될 수도 있음
이를 구분하기 위해 __name__
변수와 __main__
값이 있음
패키지
모듈을 모아놓은 디렉토리
__init__.py
: 현재 패키지에서 어떤 모듈을 제공하겠다 라는 것을 정의하는 공간
handling file
데이터의 형태에 따라서 파일을 다루는 방법이 다름
txt : text, 특별한 규칙 없이 줄나눔으로 구성
xml : html의 부모, 트리형 구조, 계층구조 <태그>를 이용하여 상, 하위 계층을 구분태그>
json : JS Object Notation, 자바 스크립트 객체 표기법, {키:값,…}
- 텍스트의 형태, 가독성이 좋아 인터넷에서 많이 사용하는 표기법
Object = {}
특정 언어에 종속되지 않고, 대부분의 언어에서 json으로 다룰 수 있도록 지원
- js 객체로 오인할 때가 있어서 라이브러리 및 모듈을 동반하여 사용
======== 끝 ========
76일차 수업
Path
현재 디렉토리나 부모의 디렉토리에 담긴 파일들의 파일이름을 가져오거나
단순 경로 목록, 파일 관련 처리 기능을 구현할 때 사용
파일 시스템에 있는 경로를 사용, 운영 체제 상에서 조작 대상의 경로가 있어야함
from pathlib import Path
p = Path(“.”) # 현재 디렉토리, 상대경로
print(p) # output “.”
print(p.resolve()) # output “/Users/spongebob53/project2/day76”, 절대경로를 반환하는 함수
# 현재 시스템, 시스템에 없는 경로는 단순출력만 가능, 작업이 안됨
p = Path(r“/Users/Sponge”) # r : raw String 문자열임을 명시
print(p)
p = Path(“..”) # 부모 디렉토리, 상대경로
print([x for x in p.iterd ir() if x.is_dir()])
# iterdir()은 디렉토리와 파일을 구분하지 못해서 if 문을 통해 구분해줘야함
# output [PosixPath('../day76'), PosixPath('../day75'), PosixPath('../day74'),…]
# glob() : 해당 경로의 하위 목록 중에 특정 파일만 가져오는 함수
p = Path(r“.”)
subs = list(p.glob(“*.py”)) # 현재 경로에서 .py인 파일 목록
print(subs)
# output [PosixPath('Ex01_yesterday.py'), PosixPath('path.py'),…]
print(Path.cwd()) # 현재 내 경로 output /Users/spongebob53/Project2/day76
print(Path.home()) # 홈 디렉토리 경로 output /Users/spongebob53
# stat() : 파일에 대한 정보 출력 함수, 리눅스 스타일로 출력
p1 = Path(“test.py”)
tm = p1.stat().st_ctime
print(tm) # output 1646223102.6849058
# from datetime import datetime 날짜형으로 변경해주는 함수 import
zt = datetime.fromtimestamp(tm)
print(zt) # output 2022-03-02 21:11:42.684906
mkdir() : 현재 경로에 디렉토리 만들기, 중복생성 시 FileExistsError
mkdir(exist_ok=True) : 중복생성 에러를 무시
p1 = Path(“temp/test”)
p1.mkdir(parents=True) # 해당 경로에 필요한 디렉토리까지 만들어주는 기능
p1.rmdir() # 디렉토리 삭제 함수, 디렉토리가 비어있지 않으면 에러
PurePath
파일 시스템에 접근해서 사용하는 경로가 아니기 때문에 경로에 없어도 가능
from pathlib import PurePath
p = PurePath(“day76/temp/test”)
print(p) # output day76/temp/test
print(p.parts) # output (‘day76’, ‘temp’, ‘test’)
# 경로 추가하기
print(p.joinpath(“python”)) # output day76/temp/test/python
# 3.4 이전 버전에서 사용하던 경로 관련 모듈
import os
print(os.environ[“HOME”]) # output /Users/spongebob53
print(os.path.expandvars(“$JAVA_HOME$”)) # output JAVA_HOME환경변수 경로
# 파일 관리 모듈
import shutil
# 대상 디렉토리에 있는 파일과 폴더를 모두 복사해서 목표 디렉토리에 복사
shutil.copytree(대상 디렉토리, 목표 디렉토리)
# 지정 디렉토리에 담긴 디렉토리 및 파일 제거
shutil.rmtree(디렉토리)
Connect DB
cx_Oracle : python 과 oracleDB를 연결할 수 있도록 도와주는 외부 모듈
-
추가 적인 설치를 통해 가능
-
pip 으로 cx_Oracle 설치
import cx_Oracle
# 로컬 db의 경우 init을 이용하지 않고 connect(“아이디/비밀번호@주소():포트/서비스이름”)으로 가능
# 클라우드 db 연결시 instantclient을 추가로 다운, 이후 진행
cx_Oracle.init_oracle_client(lib_dir= r“/Users/instantclient경로”)
connect = cx_Oracle.connect(“아이디”, “패스워드”, “프로토콜://호스트:포트/서비스이름?wallet_location=월렛 경로”)
cursor = connect.cursor() # 전송객체
sql = “select * from emp”
cursor.execute(sql) # 실행함수
datas = cursor.fetchall() # 결과를 이중 배열의 형식으로 가져오는 함수, row는 튜플로 구현
# pandas : 표의 형태의 데이터를 사용자가 보기 편하게 구현해주는 외부 모듈
import pandas
print(pandas.DataFrame(datas)) # 위의 결과가 표의 형태로 보기좋게 출력
# 데이터의 수정이 진행됬을 땐 오토 커밋 기능이 없어서 직접 해줘야함
# connect.commit()
# 작업이 끝난 뒤에는 작은 순서대로 객체 닫기
cursor.close()
connect.close()
flow
In supply.csv
Supplier Name,Invoice Number,Part Number,Cost,Purchase Date
Samsung,1001,2521,50000,2025-01-01
Samsung,1001,2521,50000,2025-01-01
In python
import csv
import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir=r “instantclient 경로”)
def saveDBTable(data):
# 데이터 가공
# 변경을 위한 변수는 임시변수이기 때문에 보통 v_ xxx 라는 식으로 작성
# 변수를 함수 내부에서 나누는 이유는 개별로 가공을 할 수도 있기 때문
v_name = data[0] + “가공”
v_name = data[1]
v_name = data[2]
v_name = data[3] + “가공”
v_name = data[4]
conn = cx_Oracle.connect(“아이디”, “패스워드”, “프로토콜://호스트:포트/서비스이름?wallet_location=월렛 경로”)
cursor = conn.cursor()
# “:” 는 자바 에서 변수를 의미하는 “?” 나 ${} 와 같은 기능
# 인덱스로도 가능하지만 조금 더 명확하게 구현하기 위해 변수명을 작성하기도 함
sql = “””
INSERT INTO supply(id,supplier_name, invoice_number, part_number, cost,purchase_date)
VALUES(seq_supply_id.nextval, :v_name, :v_invoice, :v_part, :v_cost, :v_date)
“””
# 가공한 데이터를 작성된 순서대로 1:1 매칭을 하여 대입, 튜플형만 가능
cursor.execute(sql, (v_name, v_invoice, v_part, v_cost, v_date))
conn.commit()
cursor.close()
conn.close()
file = open(“supply.csv”, “r”)
datas = csv.reader(file, delimiter = “,”) # 구분자를 쉼표로 구성
next(datas, None)
for row in datas:
saveDBTable(row)
# 데이터 저장 후, 위와 같은 방식으로 구성한 viewDBTable()이란 함수만들어 데이터를 불러오기
rows = viewDBTable(“supply”)
print(pd.DataFrame(rows).head(3)) # 위에서 3번째 까지 출력
print(pd.DataFrame(rows).tail(3)) # 아래서 3번째까지 출력
# pandas 는 row와 column을 설정할 수 있음
pd.set_option(“display.max_columns”, 3)
pd.set_option(“display.max_row”,5)
# format을 이용해 특정 열의 데이터만 출력
for a in rows:
print(f“{a[:2]}”)