728x90
반응형
SMALL
# 데이터베이스 확인하기
# ; 원래 프로그래밍 할때는 사용하지 않지만 워크벤치에서는 명령어를 실행한줄에 마지막에 사용해야 오류가 안남.
show databases; 

# 데이터베이스 생성하기
# create database 데이터베이스명;
create database kdt;

# 데이터베이스 삭제하기
# drop database 데이터베이스명;
drop database kdt

# 데이터베이스 선택하기
# use 데이터베이스 명
use kdt;

 

 

테이블 만들기
기본형태:
create table 테이블명(
필드명 자료형 조건형,
필드명2 자료형2 조건형2,
....
)
create table member(
	userid varchar(20) primary key,
    userpw varchar(200) not null,
    username varchar(20) not null,
    hp varchar(20) not null,
    email varchar(50) not null,
    gender varchar(10) not null,
    ssn1 varchar(6) not null,
    ssn2 varchar(7) not null,
    zipcode varchar(5),
    address1 varchar(100),
    address2 varchar(100),
    address3 varchar(100),
    regdate datetime default now(),
    point int default 0
);
테이블 확인하기

# desc 테이블명

desc member

테이블 삭제하기

# drop table 테이블명
drop table member

테이블 필드 추가

# alter table 테이블명 add 컬럼명 데이터타입 제약조건 

alter table member add mbti varchar(10)

테이블 필드 수정하기 

# alter table 테이블명 modify column 컬럼명 데이터타입 제약조건
alter table member modify column mbti varchar(20)

테이블 필드 삭제

# alter table 테이블명 drop 테이블명
alter table member drop mbti

테이블에 데이터 삽입하기

# insert into 테이블명 values (값1,값2,값3, ..)테이블의 필드수에 맞게
# insert into 테이블명 (필드명1, 필드명2, 필드명3...) values (값1, 값2, 값3...)

insert into member values ('apple', '1234', '김사과', '010-1234-1234', 'apple@apple.com', '남', 991234, 1010101, 07366, '서울시 서초구 방배동', '길길로', '사과아파트 101동101호', null, null);

데이터 삭제하기
delete from 테이블명;  모든데이터가 다 사라짐
delete from member;  /*Error Code: 1175. You are using safe update mode and you tried to update 
                                    a table without a WHERE that uses a KEY column.  
                                    To disable safe mode, toggle the option in Preferences -> 
                                    SQL Editor and reconnect.*/
					 모든 데이터를 날리는것이 위험하니까 안된다.
                     Edit 탭에서 프리퍼런스에서 sql에서 안전체크해제하면됌
조건절

delete from 테이블명 where 조건절

delete from member where userid = 'apple';  # userid가 apple인 사용자의 데이터를 삭제한다.

데이터 수정하기

# update 테이블명 set 필드명1 = 값1, 필드명2 = 값2 ...
# update 테이블명 set 필드명1 = 값1, 필드명2 = 값2 ... where 조건절;
update member set point = 100

여자한테만 포인트 추가해주기

update member set point = point + 200 where gender = '여'; # inplace 연산을 해줘야함

 

orange 회원의 우편번호를 '12345', 주소1은 '서울시 서초구', 주소2는 '양재동', 주소3= '아파트 101동 101호'

update member set zipcode = '12345', address1 = '서울시 서초구', address2 = '양재동', address3 = '아파트 101동 101호' where userid = 'orange';

728x90
반응형
LIST

'DBMS > MySQL' 카테고리의 다른 글

MySQL- View  (0) 2023.03.21
MySQL- 사용자 추가하기  (0) 2023.03.21
MySQL- 데이터 조작(select)  (0) 2023.03.16
MySQL- 연산자  (0) 2023.03.16
RDBMS - MySQL 정리  (0) 2023.03.15
728x90
반응형
SMALL

목차

  1. 테이블
  2. 스키마
  3. 테이블 만들기
  4. 데이터 타입
  5. 이진 데이터 타입
  6. 날짜 데이터 타입
  7. 제약 조건(constraint)
    1. not null
    2. unique
    3. primary key
    4. foreign key
    5. default
    6. enum

 

1. 테이블(table)

데이터를 행과 열로 스키마에 따라 저장할수 있는 구조
(엑셀의 시트와 같다)

2. 스키마(schemas)

데이터 베이스의 구조와 제약조건에 관한 명세를 기술한 집합의 의미
(전체적인 구조와 그 구조를 만들때의 조건같은것)

3. 테이블 만들기

create table 테이블명 (
필드명1 데이터타입 제약조건,
    (행)  (ex: int) (절대 데이터가 비면안돼, 숫자가 자동으로 증가할거야 등등)
    필드명2 데이터타입 제약조건,
    ....
    필드명n 데이터타입 제약조건
)

4. 데이터 타입(data type)


-숫자형 타입

    tinyint:          정수형 데이터 타입(1byte), -128 ~ 127 표현
    smallint:       정수형 데이터 타입(2byte), -32768 ~ 32767 표현
    mediumint:   정수형 데이터 타입(3byte), -8388608 ~ 8388607 표현
    int:                정수형 데이터 타입(4byte), 어쨋든 큼 -21 ~ 21억  
                      # 다른 프로그램에서도 int형이 기본값이기 때문에 보통 int를 디폴트로 사용하는것을 권장
    bigint:           정수형 데이터 타입(8byte), 대충 무제한
    float:             부동소수형 데이터 타입(4byte)
    decimal        (길이, 소수): 고정소수형 데이터 타입 (길이 + 1byte)
    double:         부동 소수형 데이터 타입(8byte) # 실수형에서는 더블이 가장 기본형이기때문에 속도가 빠르다


    -문자형 타입

    char(케릭터로 보통읽음): 고정길이 데이터 타입(최대 255byte 까지 저장가능)
                                           # 단점: 지정된 길이보다 짧은 데이터 입력시 나머지 공간을 공백으로 채움
    varchar:                             가변길이 데이터 타입(최대 65535byte)
                                           # 지정된 길이보다 짧은 데이터 입력시 나머지 공간은 채우지 않음
    text:                                   문자열 데이터 타입(최대 65535byte)
    longtext:                            무제한 문자열 데이터 타입

 

5. 이진 데이터 타입

# 0, 1로 된 데이터
# 영상, 음악,등등이 담겨질수 있는데이터 타입,
# 보통 영상,이런 파일들은 서버의 디렉토리(폴더)에 저장되어있고 DBMS에서는 그 주솟값만 저장하여 사용한다.

    binary or byte: char의 형태의 이진 데이터 타입, (최대 255byte)
    varbinary:        varchar의 형태의 이진데이터 타입(최대 65535byte)

6. 날짜 데이터 타입

    date:           날짜(연,월,일) 형태의 데이터 타입(3byte)
    time:           시간(시,분,초) 형태의 데이터 타입(3byte)
    datetime:    날짜와 시간 형태의 데이터 타입(8byte) 
    timestamp: 1970년 1월 1일 0시 0분 0초 부터 시작한 ms 타입의 시간이 저장(4byte)

7. 제약 조건(constraint)

데이터의 무결성을 지키기 위해 데이터를 입력받을때 실행되는 검사규칙을 의미


7-1 not null:
      - null 값을 허용하지 않음
      - 중복값을 허용
7-2 unique:
      - 중복값을 허용하지 않음
      - null 값을 허용
      - 유니크 제약조건뒤에 not null도 같이 사용가능
7-3 primary key:
      - null 값을 허용x
      - 중복값 허용x
      - 테이블에 단 하나만 사용가능
      - 테이블의 대표

7-4 foreign key
     - primary key를 가진 테이블과 연결하는 역할
      (ex. 테이블이 서로 다를경우, 게시판에서 회원만 글 작성 가능하게 하고싶을때

             회원id에 프라이머리, 게시판쪽에 foreign key 넣어주면됌)

7-5 default
      - null 값을 삽입할 때 기본이 되는 값을 저장할 수 있게 함

7-6 enum
      - 원하는 범위를 설정하고 해당 범위의 값만 저장 

      # (왠만하면 안씀, 권장하지 x )
      ex) enum('남자', '여자') 하면 남자,여자 여야만 저장가능 아니면에러
 

728x90
반응형
LIST

'DBMS > MySQL' 카테고리의 다른 글

MySQL- View  (0) 2023.03.21
MySQL- 사용자 추가하기  (0) 2023.03.21
MySQL- 데이터 조작(select)  (0) 2023.03.16
MySQL- 연산자  (0) 2023.03.16
MySQL - table  (0) 2023.03.15
728x90
반응형
SMALL

목차

  1. DBMS를 사용하는 이유
  2. 데이터베이스 모델(database model)
  3. 데이터베이스 종류
  4. 서버(Server)란?
  5. 클라이언트(Client)란? 
  6. Port 번호
  7. Localhost
  8. 관계형 데이터베이스 (RDBMS)
  9. SQL (Structured Query Language)

 

 

 

1.  DBMS를 사용하는 이유

- 중복된 데이터를 제거 또는 관리
- 효율적인 데이터를 처리
- 자료를 구조화 시킬 수 있음
- 다양한 프로그램을 사용하는 사용자들과 데이터를 공유

 

 

 

2. 데이터베이스 모델

- Relational:
                  관계형(SQL이라는 언어를 사용하는 특징이 있다.), 안정성은 높은데 속도가 좀 느리다.
- Document:
                  메모장에 저장하듯이 막때려넣고 불러올때는 굉장히 빠르게, 주식,sns,채팅등에서 많이 사용.

 

 

3. 데이터베이스 종류

- Oracle
- MySQL
- PostgreSQL
- MongoDB
- Elasticsearch
- MariaDB

 

 

4. 서버(Server)란?

- 정보를 제공하는 쪽
- 서버를 이용하기위해서 사용자는 설치를 할 필요 없음

 

 

5. 클라이언트(Client)란?

- 정보를 요청하는 쪽

 

 

6. Port 번호

- IP 주소를 가지고 서버의 랜카드까지 도달 후 원하는 프로그램에 도달하게 할 수 있는 번호
- 중복 시 둘 중 하나가 사용불가

 

 

7. Localhost

- 내 컴퓨터를 나타내는 IP 주소

 

 

8. 관계형 데이터베이스 (RDBMS)

  • 데이터베이스를 -> Table (엑셀과 비슷)
  • 행 (row, record), 열 (field, column)
  • SQL 언어를 사용

 

9. SQL (Structured Query Language)

  • 데이터베이스에서 데이터를 정의, 조작, 제어 하기 위해 사용하는 언어
  • 대소문자를 구별하지 않음
  • 문자열을 저장할 때 '  ' (싱글 쿼트)만 사용
  • 주석문:

                   한 줄 주석문 (# or --)

                   여러줄: /* , */ 로 시작과 끝을 감싼다

728x90
반응형
LIST
728x90
반응형
SMALL

1. esc키나 ctrl + m 을 눌러서 파란색 창으로 만든후에 사용:

 

a : 위에 새로운 셀 추가

b : 아래에 새로운 셀 추가

c : 셀 복사하기

v : 셀 붙여넣기

x : 셀 잘라내기

dd : 셀 삭제하기

p : 셀 아래에 붙여넣기

o : 실행결과 열기/닫기

m : Markdown으로 변경

y : Code로 변경

Shift + m : 선택 셀과 아래 셀과 합치기

Ctrl + s 또는 s : 파일 저장

Enter : 선택 셀의 코드 입력 모드로 돌아가기

 

2. (입력 모드) Ctrl + Enter : 입력 셀 실행

 

Shift + Enter : 입력 셀 실행 후 아래 셀로 이동 (없으면 새로운 셀 추가)

Alt + Enter : 입력영역 실행 후 아래 새로운 영역 추가

Ctrl + a : 선택 셀의 코드 전체 선택

Ctrl + z : 선택 셀 내 실행 취소

Ctrl + y : 선택 셀 내 다시 실행

Ctrl + / : 커서 위치 라인 주석처리

Shitf + Ctrl + - : 커서 위치에서 셀 둘로 나누기

728x90
반응형
LIST
728x90
반응형
SMALL

1. 압축파일 정리하기

 

 

# 현재 폴더 위치 확인
import os
os.getcwd()
 
'C:\\eadgnus\\python\\jupyter'
 

 

# 정리 대상 폴더 경로를 설정
target_path = './고라니'
 
 

 

# 압축 파일 확인
import glob
zipfile_path = []
for filename in glob.glob(os.path.join(target_path, '**/*.zip'), recursive=True):
    zipfile_path.append(filename)
    print(zipfile_path)
 
['./고라니\\데이터저장_물류.zip']

 

# 압축파일 해제
import zipfile

for filename in zipfile_path:
    with zipfile.ZipFile(filename) as myzip:
        zipinfo = myzip.infolist() # zip 파일 정보
        for info in zipinfo:
            decode_name = info.filename.encode('cp437').decode('euc-kr') # 한글 깨짐 방지
            info.filename = os.path.join(target_path, decode_name)
            myzip.extract(info)
 

2. 파일명 정리하기


 

# 주피터, 코랩 노트북에서 리눅스 환경 명령어로 모듈 설치
!pip install openpyxl
 

 

import openpyxl as opx
 

 

# 정리 대상 폴더 경로를 설정
target_path = './고라니'
 
 

 

# 폴더별 파일명을 입력 받아 엑셀 파일에 저장하는 함수

def getFileName(target_path):
    dir_list = os.listdir(target_path) # 고라니 폴더 안의 파일 확인
#     print(dir_list)

    wb = opx.Workbook() # 엑셀을 생성하는 객체
    ws = wb.active      # 새로 생성한 workbook의 활성화 시트를 ws로 정의
    
            #행    #열
    ws.cell(row=1, column=1).value = '파일경로' # 첫번째 로우 1번 컬럼에 파일경로로 입력
    ws.cell(row=1, column=2).value = '파일명(변경전)'
    ws.cell(row=1, column=3).value = '파일명(변경후)'
    

    
    i = 2 # 1 행에는 입력이 다 되어서 2행부터 입력할거라 2로 줌
    
    current_dir = target_path # 고라니폴더 경로 변수로 지정
    filelist = os.listdir(current_dir) # 고라니 폴더 안의 파일이름들 변수로 지정
    
    for filename in filelist:
        ws.cell(row = i, column = 1).value = current_dir +"/" 
        # ws엑셀을 .cell(i행 1열부터 값을 고라니폴더경로에서 하위 경로를 표현해주기위해 / 더한것 )
        
        ws.cell(row = i, column = 2).value = filename
        # ws엑셀을 i행 2열에 파일이름을 i증가하는값에다가 하나씩 넣기
        i += 1
    
    wb.save(os.path.join(target_path, 'filelist.xlsx'))
 
 

 

# 선생님 코드

# 폴더별 파일명을 입력 받아 엑셀파일에 저장하는 함수
def getFileName(target_path):

    wb = opx.Workbook()
    ws = wb.active # 새로 생성한 WorkBook의 활성화 시트를 ws로 정의
    ws.cell(row=1, column=1).value = '파일경로'
    ws.cell(row=1, column=2).value = '파일명(변경전)'
    ws.cell(row=1, column=3).value = '파일명(변경후)'
    i = 2
    current_dir = target_path
    filelist = os.listdir(current_dir)
    for filename in filelist:
        ws.cell(row=i, column=1).value = current_dir + "/"
        ws.cell(row=i, column=2).value = filename
        i = i+1
    wb.save(os.path.join(target_path, 'filelist.xlsx'))
 

 

getFileName(target_path)
 

3. 파일명 변경하기


 

def excelRead(file_path : str) -> tuple:
    
    wb = opx.load_workbook(file_path)
    ws = wb.active
    
    dirpath = [r[0].value for r in ws]
    file_before = [r[1].value for r in ws]
    file_after = [r[2].value for r in ws]
    
    len_num = len(dirpath) # for문 몇바퀴 돌까
    datalist = []
    
    for i in range(1, len_num):
        temp_tuple = (dirpath[i], file_before[i], file_after[i])
        datalist.append(temp_tuple)

    return datalist
 

 

rename_list = excelRead(os.path.join(target_path, 'filelist.xlsx'))
print(rename_list)
 
[('./고라니/', 'A_2022_01_13_부서로그_인사_001.pdf', 'A_2022_01_13_부서로그_인사_001.pdf'), ('./고라니/', 'A_2022_01_13_부서로그_인사_002.pdf', 'A_2022_01_13_부서로그_인사_002.pdf'), ('./고라니/', 'A_2022_01_13_부서로그_인사_003.pdf', 'A_2022_01_13_부서로그_인사_003.pdf'), ('./고라니/', 'A_2022_04_10_생산로그_생산_001.pdf', 'A_2022_04_10_생산로그_생산_001.pdf'), ('./고라니/', 'A_2022_04_10_생산로그_생산_002.pdf', 'A_2022_04_10_생산로그_생산_002.pdf'), ('./고라니/', 'A_2022_04_10_생산로그_생산_003.pdf', 'A_2022_04_10_생산로그_생산_003.pdf'), ('./고라니/', 'A_2022_04_10_생산로그_생산_004.pdf', 'A_2022_04_10_생산로그_생산_004.pdf'), ('./고라니/', 'A_2022_06_30_생산로그_생산_001.pdf', 'A_2022_06_30_생산로그_생산_001.pdf'), ('./고라니/', 'A_2022_06_30_생산로그_생산_002.pdf', 'A_2022_06_30_생산로그_생산_002.pdf'), ('./고라니/', 'A_2022_07_20_부서로그_인사_001.pdf', 'A_2022_07_20_부서로그_인사_001.pdf'), ('./고라니/', 'A_2022_07_20_부서로그_인사_002.pdf', 'A_2022_07_20_부서로그_인사_002.pdf'), ('./고라니/', 'A_2022_07_20_부서로그_인사_003.pdf', 'A_2022_07_20_부서로그_인사_003.pdf'), ('./고라니/', 'A_2022_07_20_부서로그_인사_004 (1).pdf', 'A_2022_07_20_부서로그_인사_004.pdf'), ('./고라니/', 'B_2022_02_20_상반기_클래스설계_001.xlsx', 'B_2022_02_20_상반기_클래스설계_001.xlsx'), ('./고라니/', 'B_2022_02_20_상반기_클래스설계_002.xlsx', 'B_2022_02_20_상반기_클래스설계_002.xlsx'), ('./고라니/', 'B_2022_06_20_하반기_클래스설계_001.xlsx', 'B_2022_06_20_하반기_클래스설계_001.xlsx'), ('./고라니/', 'B_2022_06_30_하반기_클래스설계_002.xlsx', 'B_2022_06_30_하반기_클래스설계_002.xlsx'), ('./고라니/', 'C_2022_03_30_데이터베이스_ERD_001.xlsx', 'C_2022_03_30_데이터베이스_ERD_001.xlsx'), ('./고라니/', 'C_2022_03_30_데이터베이스_ERD_002.xlsx', 'C_2022_03_30_데이터베이스_ERD_002.xlsx'), ('./고라니/', 'C_2022_03_30_데이터베이스_ERD_003.xlsx', 'C_2022_03_30_데이터베이스_ERD_003.xlsx'), ('./고라니/', 'C_2022_09_10_데이터베이스_ERD_001 (1).xlsx', 'C_2022_09_10_데이터베이스_ERD_001.xlsx'), ('./고라니/', 'C_2022_09_10_데이터베이스_ERD_002.xlsx', 'C_2022_09_10_데이터베이스_ERD_002.xlsx'), ('./고라니/', 'C_2022_09_10_데이터베이스_ERD_003.xlsx', 'C_2022_09_10_데이터베이스_ERD_003.xlsx'), ('./고라니/', 'D_20220110_데이터저장_물류_001.pdf', 'D_20220110_데이터저장_물류_001.pdf'), ('./고라니/', 'D_20220110_데이터저장_물류_002.pdf', 'D_20220110_데이터저장_물류_002.pdf'), ('./고라니/', 'D_20220723_데이터저장_물류_001.pdf', 'D_20220723_데이터저장_물류_001.pdf'), ('./고라니/', 'D_20220723_센터가동현황_물류_002.pdf', 'D_20220723_센터가동현황_물류_002.pdf'), ('./고라니/', 'filelist.xlsx', 'filelist.xlsx'), ('./고라니/', '내사진.jpg', '내사진.jpg'), ('./고라니/', '데이터저장_물류.zip', '데이터저장_물류.zip'), ('./고라니/', '새파일1_복사본.txt', '새파일1_복사본.txt'), ('./고라니/', '점심시간.txt', '저녁시간.txt'), ('./고라니/', '주피터노트북.txt', '주피터노트북.txt')]

 

# 파일 이름 변경하기
import shutil

def fileRename(datalist : list):
    try:
        for data in datalist:
            print(data[1] + '의 파일명을 -> ' + data[2] + '로 변경합니다')
            shutil.move(data[0] + data[1], data[0] + data[2])
    except FileNotFoundError as e:
        print('이미 변경되었습니다.')
 

 

fileRename(rename_list)
 
A_2022_01_13_부서로그_인사_001.pdf의 파일명을 -> A_2022_01_13_부서로그_인사_001.pdf로 변경합니다
A_2022_01_13_부서로그_인사_002.pdf의 파일명을 -> A_2022_01_13_부서로그_인사_002.pdf로 변경합니다
A_2022_01_13_부서로그_인사_003.pdf의 파일명을 -> A_2022_01_13_부서로그_인사_003.pdf로 변경합니다
A_2022_04_10_생산로그_생산_001.pdf의 파일명을 -> A_2022_04_10_생산로그_생산_001.pdf로 변경합니다
A_2022_04_10_생산로그_생산_002.pdf의 파일명을 -> A_2022_04_10_생산로그_생산_002.pdf로 변경합니다
A_2022_04_10_생산로그_생산_003.pdf의 파일명을 -> A_2022_04_10_생산로그_생산_003.pdf로 변경합니다
A_2022_04_10_생산로그_생산_004.pdf의 파일명을 -> A_2022_04_10_생산로그_생산_004.pdf로 변경합니다
A_2022_06_30_생산로그_생산_001.pdf의 파일명을 -> A_2022_06_30_생산로그_생산_001.pdf로 변경합니다
A_2022_06_30_생산로그_생산_002.pdf의 파일명을 -> A_2022_06_30_생산로그_생산_002.pdf로 변경합니다
A_2022_07_20_부서로그_인사_001.pdf의 파일명을 -> A_2022_07_20_부서로그_인사_001.pdf로 변경합니다
A_2022_07_20_부서로그_인사_002.pdf의 파일명을 -> A_2022_07_20_부서로그_인사_002.pdf로 변경합니다
A_2022_07_20_부서로그_인사_003.pdf의 파일명을 -> A_2022_07_20_부서로그_인사_003.pdf로 변경합니다
A_2022_07_20_부서로그_인사_004 (1).pdf의 파일명을 -> A_2022_07_20_부서로그_인사_004.pdf로 변경합니다
이미 변경되었습니다.

4. 폴더 생성하기


 

import fnmatch
 

 

# 카테고리 리스트 만들기

def categoryList(target_path : str) -> list:
    file_list = []
    for filename in os.listdir(target_path): # 파일 패스를 받아서 
        if fnmatch.fnmatch(filename, '*_[0-9][0-9][0-9].*'):
            file_list.append(filename)
            
    category = []
    for file in file_list:
        
        # A_2022_06_30_생산로그_생산_002 이라면
        temp_list = file.split('_') # ['b', '2022', '02', .... 이런식으로 저장됌]
        category.append(temp_list[-2]) # 생산 부분에 있는글자를 리스트에 추가한다.
        
    temp_set = set(category)
    result = list(temp_set)
    return result
        

 

 

categoryList(target_path)
 
['물류', '생산', '클래스설계', 'ERD', '인사']

 

categorylist = categoryList(target_path) + ['기타']
print(categorylist)
 
['물류', '생산', '클래스설계', 'ERD', '인사', '기타']

 

# 폴더 생성하기
import pathlib
 

 

new_path = './new_dir'

def makeDir(new_path:str, categorylist:list):
    for category in categorylist:
        new_dir = pathlib.Path(os.path.join(new_path, category))
        new_dir.mkdir(parents=True, exist_ok=True) # 부모폴더가 없으면 만들고 # 이미 존재하면 덮어쓰기
 

 

makeDir(new_path, categorylist)
 

5. 파일 분류 및 이동하기


 

import shutil
 

 

new_path = './new_dir'
target_path = './고라니'
categorylist = categoryList(target_path) + ['기타']
 

 

 

 

 
 

 

728x90
반응형
LIST

'파이썬' 카테고리의 다른 글

MySQL client 라이브러리  (0) 2023.03.22
DAO,DTO,VO  (0) 2023.03.22
파일 입출력 라이브러리  (0) 2023.03.14
데코레이터(Decorator) - 함수 꾸며주기  (0) 2023.03.13
클로저(Closure)  (0) 2023.03.13
728x90
반응형
SMALL

1. 파일 읽기 및 저장하기

 

1-1. fileinput

  • 텍스트 파일을 읽고, 쓰고, 저장하는 기능을 편리하게 사용할 수 있도록 해주는 라이브러리
  • 여러개의 파일을 읽어서 수정할 수 있음
 

import fileinput
import os # 현재 os의 파일들의 경로를 확인하는데 도움을 주는 라이브러리
import glob
 
 
# 현재 경로 확인
os.getcwd()
 
'C:\\eadgnus\\python\\jupyter'
 

 

# 디렉토리 내 파일 확인
os.listdir(os.getcwd())
 
['.ipynb_checkpoints',
 '24. 파일 입출력 라이브러리.ipynb',
 'list.pkl',
 'sample',
 'word.txt']
 

 

# 경로 설정
path = 'sample/'
 
 

 

# glob(): 해당 경로의 파일 이름을 리스트로 반환
glob.glob(os.path.join(path, '*txt'))
 
['sample\\새파일1.txt',
 'sample\\새파일2.txt',
 'sample\\새파일3.txt',
 'sample\\새파일4.txt',
 'sample\\새파일5.txt']

 

with fileinput.input(glob.glob(os.path.join(path, '*txt'))) as f:
    for line in f:
        print(line)
 
첫번째 줄입니다

2번째 줄입니다.

3번째 줄입니다.
첫번째 줄입니다

5번째 줄입니다.

6번째 줄입니다.
첫번째 줄입니다

8번째 줄입니다.

9번째 줄입니다.
첫번째 줄입니다

첫번째 줄입니다

첫번째 줄입니다

14번째 줄입니다.

15번째 줄입니다.

 

txt_files = glob.glob(os.path.join(path, '*txt'))
 

 

txt_files
 
['sample\\새파일1.txt',
 'sample\\새파일2.txt',
 'sample\\새파일3.txt',
 'sample\\새파일4.txt',
 'sample\\새파일5.txt']

 

# 각 파일의 첫번째 라인을 찾아 변경하기 # 위에서 모든 텍스트 파일로 지정해서 모든것이 바뀜
with fileinput.input(txt_files, inplace=True) as f: # inplace: 덮어쓰다
    for line in f:
        if f.isfirstline(): # 이게 첫번째라인인지가 T,F 로 반환되는 메소드
            print('첫번째 라인 입니다', end='\n')            
        else:
            print(line, end='')
print(line)
 

 

# 검색된 라인 변경하기
with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if line == '첫번째 라인 입니다\n':
            print('1번째 라인입니다', end='\n')
        else:
            print(line, end='')
 

 

# 키워드 포함 변경하기
with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if '1번째' in line:
            print('첫번째 줄입니다', end='\n')
        else:
            print(line, end='')
 

 

# 텍스트 치환하기
with fileinput.input(txt_files, inplace=True) as f:
    for line in f:
        if '12번째' in line:
            line.replace('12번째', '열두번째', end='')
        else:
            print(line, end='')
 

1-2. pickle

  • 파이썬에서 사용하는 딕셔너리 리스트, 클래스 등의 자료형을 변환없이 그대로 파일로 저장하고 불러올 때 사용하는 모듈

 

import pickle
 

 

data = ['apple', 'banana', 'orange']
 

 

# 파일 저장
with open('list.pkl', 'wb') as f:
    pickle.dump(data, f)
 

 

# 파일 읽기
with open('list.pkl', 'rb') as f:
    data = pickle.load(f)
 

 

type(data)
 
 

 

print(data)
 

 

# 딕셔너리 저장
data = {}
data[1] = {'id': 1, 'userid': 'apple', 'name': '김사과', 'gender': '여자', 'age': 20}
 
 

 

# 파일저장
with open('dict.pkl', 'wb') as f:
    pickle.dump(data, f)
 

 

with open('dict.pkl', 'rb') as f:
    data = pickle.load(f)
 

 

print(data)
 
{1: {'id': 1, 'userid': 'apple', 'name': '김사과', 'gender': '여자', 'age': 20}}
 

2. 파일 찾기, 복사, 이동하기


2-1. 파일 확장자로 찾기


 

os.getcwd()
 
'C:\\eadgnus\\python\\jupyter'
 

 

for filename in glob.glob('*.txt'):
    print(filename)
 
word.txt
주피터 설치법.txt

 

# txt 파일 하위경로에서 찾기:
for filename in glob.glob('**/*.txt'):
    print(filename)
 
sample\새파일1.txt
sample\새파일2.txt
sample\새파일3.txt
sample\새파일4.txt
sample\새파일5.txt

 

# txt 파일 찾기 : 현재와 하위경로 모두 포함
for filename in glob.glob('**/*.txt', recursive=True):
    print(filename)
 
주피터 설치법.txt
sample\새파일1.txt
sample\새파일2.txt
sample\새파일3.txt
sample\새파일4.txt
sample\새파일5.txt

 

# 파일명 글자수로 찾기
for filename in glob.glob('????.*', recursive=True): # 글자수 4개  # ? 의 개수 == 글자수
    print(filename)
 
dict.pkl
list.pkl
 

 

for filename in glob.glob('???????.*', recursive=True): # 글자수 7개
    print(filename)
 
주피터 설치법.txt

 

# 문자열 패턴 포함 파일명 찾기
for filename in glob.glob('[a-z]???.*', recursive=True): # [] 안에 범위지정 
    # 모든 파일명부분 물음표칸에 범위지정 가능
    print(filename)
 
dict.pkl
list.pkl

 

for filename in glob.glob('**/새파일*.*'):
    print(filename)
 
sample\새파일1.txt
sample\새파일2.txt
sample\새파일3.txt
sample\새파일4.txt
sample\새파일5.txt

 

# 프로젝트라는 단어가 들어가는 파일을 찾기
for filename in glob.glob('**/*프로젝트*.*'):
    print(filename)
 
project\25. 프로젝트 실습.ipynb
project\프로젝트 개요.txt

2-2. fnmatch

  • glob과 동일하게 특정한 패턴을 따르는 파일명을 찾아주는 모듈
  • 파일명 매칭 여부를 True와 False 형태로 반환하기 때문에 os.listdir() 함수와 함께 사용

 

import fnmatch
 

 

# 파일명은 '새' 로 시작하고 확장명은 .txt를 검색
# 확장자를 제외한 파일명의 길이는 4개이며 파일명의 마지막 문자는 숫자
for filename in os.listdir('./sample'):
    if fnmatch.fnmatch(filename, '새??[0-9].txt'):
        print(filename)
 
새파일1.txt
새파일2.txt
새파일3.txt
새파일4.txt
새파일5.txt

shutil

  • 파일을 복사하거나 이동할 때 사용하는 내장 모듈

 

import shutil
 
 

 

# 파일 복사하기
shutil.copy('./sample/새파일1.txt', './sample/새파일1_복사본.txt')
 
'./sample/새파일1_복사본.txt'

 

# 파일 이동하기
shutil.move('./sample/새파일1_복사본.txt', './새파일1_복사본.txt') # 윈도우에서는 오른쪽 객체는 ./ 생략가능
 
'./새파일1_복사본.txt'

 


 

# 확장명 바꾸기 # 덮어쓰기
shutil.move('./새파일1_복사본.txt', './새파일1_복사본.py')
 
'./새파일1_복사본.py'
 

 

shutil.move('./새파일1_복사본.py', './새파일1_복사본.txt')
 
'./새파일1_복사본.txt'

3. 파일 압축


3-1. 데이터 압축

  • 대용량 데이터 및 대량의 파일을 전송 시, 전송 속도가 느리며 전송 문제가 발생할 가능성이 매우 높음
  • 데이터 압축의 종류
    • 손실 압축: 사람이 눈치채지 못할 수준의 정보만 버리고 압축
    • 무손실 압축: 데이터 손실 x
  • 압축률: 압축된 자료량 (압축된 데이터 크기) / 원시 자료량(원본 데이터 크기)
  • 다양한 압축 알고리즘에 따라 압축 성능 및 시간이 좌우됌
  • 압축: 인코딩(Encoding)
  • 압축해제: 디코딩(Decoding)

3-2. zlib

  • 데이터를 압축 하거나 해제할 때 사용하는 모듈
  • compress()라는 함수와 decompress()라는 함수로 문자열을 압축하거나 해제

 

import zlib
 

 

data = 'Hello Python!' * 10000
 

 

print(len(data)) # 130000 byte
 
130000

 

# 압축하기
compress_data = zlib.compress(data.encode(encoding='utf-8'))
print(len(compress_data))
 
293

 

compress_data
 
b'x\x9c\xed\xc71\r\x00 \x0c\x000+\xe0f\'&H8\x16\xf6\xf0\xe0\x1e\x1f\xa4\xfd\x1a3\xb3\xda\xb8g\xd5\xee!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""?\xe6\x01le79'
 

 

# 압축 해제
org_data = zlib.decompress(compress_data).decode('utf-8')
print(len(org_data))
 
130000
 

3-3. gzip

  • 파일을 압축하거나 해제할때 사용하는 모듈
  • 내부적으로 zlib 알고리즘을 사용

 

import gzip
 

 

with open('org_data.txt', 'w') as f:
    f.write(data)
 

 

# gzip 압축 하기
with gzip.open('compressed.txt.gz', 'wb') as f:
    f.write(data.encode('utf-8'))
 

 

# gzip 압축 풀기
with gzip.open('compressed.txt.gz', 'rb') as f:
    org_data = f.read().decode('utf-8')
 

 

print(len(org_data))
 
130000

3-4. zipfile

  • 여러개 파일을 zip 확장자로 합쳐서 압축할 때 사용하는 모듈

 

import zipfile
 

 

# 파일 합치고 압축하기
with zipfile.ZipFile('./sample/새파일.zip', 'w') as myzip:
    myzip.write('./sample/새파일1.txt')
    myzip.write('./sample/새파일2.txt')
    myzip.write('./sample/새파일3.txt')
    myzip.write('./sample/새파일4.txt')
    myzip.write('./sample/새파일5.txt')
 

 

# 압축 해제하기
with zipfile.ZipFile('./sample/새파일.zip') as myzip:
    myzip.extractall()
 

3-5. tarfile

  • 여러개 파일을 tar 확장자로 합쳐서 압축할 때 사용하는 모듈

 

import tarfile
 

 

with tarfile.open('./sample/새파일.tar', 'w') as mytar:
    mytar.add('./sample/새파일1.txt')
    mytar.add('./sample/새파일2.txt')
    mytar.add('./sample/새파일3.txt')
    mytar.add('./sample/새파일4.txt')
    mytar.add('./sample/새파일5.txt')
 

 


 

728x90
반응형
LIST

'파이썬' 카테고리의 다른 글

DAO,DTO,VO  (0) 2023.03.22
폴더 관리(이동, 복사, 정렬)  (0) 2023.03.14
데코레이터(Decorator) - 함수 꾸며주기  (0) 2023.03.13
클로저(Closure)  (0) 2023.03.13
인코딩과 디코딩  (0) 2023.03.13

+ Recent posts