/ LECTURE

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]})