파이썬코딩

파이썬코드 피클을 사용하여 직렬화

데이터 구조를 파일에 저장하는 것을 직렬화라고 합니다. JSON과 같은 형식을 사용하려면 파이썬 프로그램의 모든 데이터 유형을 직렬화하기 위해 일부 사용자 지정 변환기가 필요할 수 있습니다. 파이썬은 특별한 바이너리 형식으로 객체를 저장하고 복원할 수 있는 피클 모듈을 제공한다.

날짜/시간 객체를 만났을 때 JSON이 어떻게 정신을 잃었는지 기억하십니까? 피클에 대한 확률 없음:

 

>>> import pickle
>>> import datetime
>>> now1 = datetime.datetime.utcnow()
>>> pickled = pickle.dumps(now1)
>>> now2 = pickle.loads(pickled)
>>> now1
datetime.datetime(2014, 6, 22, 23, 24, 19, 195722) >>> now2
datetime.datetime(2014, 6, 22, 23, 24, 19, 195722) 

피클은 당신의 클래스나 오브젝트에서도 작동한다. 문자열로 처리될 때 문자열 'tiny'를 반환하는 Tiny라는 작은 클래스를 정의합니다.

 

>>> import pickle
>>> class Tiny():
... def __str__(self): ... return 'tiny' ...
>>> obj1 = Tiny() 

>>> obj1
<__main__.Tiny object at 0x10076ed10>
>>> str(obj1)
'tiny'
>>> pickled = pickle.dumps(obj1)
>>> pickled b'\x80\x03c__main__\nTiny\nq\x00)\x81q\x01.' >>> obj2 = pickle.loads(pickled)
>>> obj2
<__main__.Tiny object at 0x10076e550>
>>> str(obj2)
'tiny' 

절인 것은 물체 obj1로부터 만들어진 절인 2진법 끈이다. 우리는 그것을 객체 obj2로 다시 변환하여 obj1의 복사본을 만들었습니다. 덤프()를 사용하여 파일에 피클하고 로드()를 사용하여 파일에서 피클을 해제합니다.

 

피클은 파이썬 개체를 만들 수 있기 때문에 이전 섹션에서 설명한 것과 동일한 보안 경고 잉그가 적용됩니다. 신뢰하지 않는 것을 풀지 마라.

 

구조화된 이진 파일

일부 파일 형식은 특정 데이터 구조를 저장하기 위해 설계되었지만, 규격 데이터베이스도 NoSQL 데이터베이스도 아니다. 다음 절에서는 그 중 일부를 제시합니다.

 

스프레드시트

스프레드시트, 특히 Microsoft Excel은 널리 사용되는 이진 데이터 형식입니다. 스프레드시트를 CSV 파일에 저장할 수 있는 경우 앞서 설명한 표준 CSV 모듈을 사용하여 스프레드시트를 읽을 수 있습니다. 이진 xls 파일이 있는 경우 xlrd는 읽고 쓰기를 위한 타사 패키지입니다.

 

HDF5

HDF5는 다차원 또는 계층적 숫자 데이터를 위한 이진 데이터 형식입니다. 대용량 데이터셋(기가바이트 ~ 테라바이트)에 대한 빠른 랜덤 액세스가 일반적인 요구 사항인 과학 분야에서 주로 사용됩니다. 어떤 경우에는 HDF5가 데이터베이스의 좋은 대안이 될 수 있지만, 어떤 이유로 HDF5는 비즈니스 세계에서 거의 알려져 있지 않습니다. 충돌하는 쓰기로부터 데이터베이스를 보호할 필요가 없는 WORM(Write Once/Read Many) 애플리케이션에 가장 적합합니다. 다음은 유용한 몇 가지 모듈입니다.

 

h5py는 완전 저수준 인터페이스입니다. 설명서 및 코드를 읽습니다.

 

PyTables는 데이터베이스와 유사한 기능을 가진 좀 더 높은 레벨입니다. 설명서와 코드를 읽습니다.

이 두 가지 모두 부록 C에서 파이썬의 과학적 적용 측면에서 논의된다. 여기서 말하는 것은 대량의 데이터를 저장 및 검색해야 하는 경우 일반적인 데이터베이스 솔루션뿐만 아니라 외부 솔루션을 고려할 의사가 있는 경우입니다. 좋은 예는 HDF5 형식의 다운로드 가능한 노래 데이터가 있는 Million Song 데이터 세트입니다

 

관계형 데이터베이스

관계형 데이터베이스는 약 40년 밖에 되지 않았지만 컴퓨팅 세계 어디에서나 볼 수 있습니다. 여러분은 거의 틀림없이 한 번 혹은 여러 번 그들을 상대해야 할 것입니다. 그러면 다음과 같은 혜택을 누릴 수 있습니다.

 

• 여러 동시 사용자의 데이터 액세스

• 해당 사용자에 의한 손상 방지

• 효율적인 데이터 저장 및 검색 방법

• 스키마에 의해 정의되고 제약에 의해 제한되는 데이터

• 다양한 유형의 데이터에 걸친 관계를 찾기 위한 결합

• 선언적(필수적) 질의 언어: SQL(구조화된 쿼리 언어)

 

이것들은 서로 다른 종류의 데이터들 사이의 관계를 표의 형태로 보여주기 때문에 관계형이라고 불린다. 예를 들어, 앞의 메뉴 예에서는 각 품목과 가격 사이에 관계가 있습니다.

 

테이블은 스프레드시트와 유사한 행과 열의 그리드입니다. 테이블을 만들려면 테이블 이름을 지정하고 열의 순서, 이름 및 유형을 지정하십시오. 결측 데이터(null이라고 함)를 허용하도록 열을 정의할 수 있지만 각 행에는 동일한 열이 있습니다. 메뉴 예제에서는 판매되는 각 품목에 대해 하나의 행으로 테이블을 만들 수 있습니다. 각 품목에는 가격에 대한 열을 포함하여 동일한 열이 있습니다.

 

열 또는 열 그룹은 일반적으로 테이블의 기본 키이며 해당 값은 테이블에서 고유해야 합니다. 이렇게 하면 테이블에 동일한 데이터를 두 번 이상 추가할 수 없습니다. 이 키는 쿼리 중 빠른 검색을 위해 인덱싱됩니다. 색인은 책 색인처럼 작동하기 때문에 특정 행을 빨리 찾을 수 있습니다.

각 테이블은 디렉토리 내의 파일처럼 상위 데이터베이스 내에 있습니다. 두 단계의 위계질서가 상황을 조금 더 잘 정리하도록 도와줍니다.

 

예, 데이터베이스라는 단어는 서버, 테이블 컨테이너 및 여기에 저장된 데이터로 여러 가지 방법으로 사용됩니다. 모든 항목을 동시에 참조하는 경우 데이터베이스 서버, 데이터베이스 및 데이터라고 부르는 것이 도움이 될 수 있습니다.

 

키가 아닌 일부 열 값으로 행을 찾으려면 해당 열에 보조 인덱스를 정의합니다. 그렇지 않은 경우, 데이터베이스 서버는 테이블 검색을 수행해야 합니다. 즉, 일치하는 열 값을 찾기 위해 모든 행을 무차별적으로 검색합니다.

테이블은 외부 키를 사용하여 서로 연관될 수 있으며 열 값은 이러한 키에 변형될 수 있습니다.

 

SQL

SQL은 API나 프로토콜이 아니라 선언적 언어입니다. 어떻게 하느냐 보다는 원하는 것을 말합니다. 이것은 관계형 데이터베이스의 보편적인 언어입니다. SQL 쿼리는 클라이언트가 데이터베이스 서버로 보내는 텍스트 문자열로, 이 문자열로 수행할 작업을 결정합니다.

다양한 SQL 표준 정의가 존재했지만, 모든 데이터베이스 공급업체는 자체적인 수정과 확장을 추가하여 많은 SQL 방언들을 만들어냈다. 데이터를 관계형 데이터베이스에 저장하면 SQL이 어느 정도 휴대성을 제공합니다. 그러나 방언 및 운영상의 차이로 인해 데이터를 다른 유형의 데이터베이스로 이동하기가 어려울 수 있습니다.

SQL 문에는 두 가지 주요 범주가 있습니다.

DDL(데이터 정의 언어)

테이블, 데이터베이스 및 사용에 대한 작성, 삭제, 제약 조건 및 사용 권한 처리

DML(데이터 조작 언어)

데이터 삽입, 선택, 업데이트 및 삭제 처리 표 8-1은 기본 SQL DDL 명령을 나열합니다.

표 8-1. 기본 SQL DDL 명령

 

Operation 

Create a database
Select current database
Delete a database and its tables Create a table
Delete a table
Remove all rows from a table 

SQL pattern 

CREATE DATABASE dbname
USE dbname
DROP DATABASE dbname CREATE TABLE tbname ( coldefs ) DROP TABLE tbname 

TRUNCATE TABLE tbname 

SQL example 

CREATE DATABASE d
USE d
DROP DATABASE d
CREATE TABLE t (id INT, count INT) DROP TABLE t 

TRUNCATE TABLE t 

 

왜 대문자는 다 쓰죠? SQL은 대소문자를 구분하지 않지만 코드 검사에서 키워드를 SHOUT하는 것이 전통입니다. 열 이름과 구별하기 위해 사용합니다.

관계형 데이터베이스의 주요 DML 작업은 흔히 CRUD 약어로 알려져 있습니다.

• SQL INSERT 문을 사용하여 작성

• SELECT를 사용하여 읽기

• UPDATE를 사용하여 업데이트

• DELETE를 사용하여 삭제

표 8-2는 SQL DML에 사용할 수 있는 명령을 살펴본다. 표 8-2. 기본 SQL DML 명령

 

Operation 

Add a row 

Select all rows and columns Select all rows, some columns 

Select some rows, some columns 

Change some rows in a column Delete some rows 

 

SQL pattern 

INSERT INTO tbname VALUES( ...) 

SELECT * FROM tbname SELECT cols FROM tbname 

SELECT cols FROM tbname WHERE condition 

UPDATE tbname SET col = value WHERE condition 

DELETE FROM tbname WHERE condition 

SQL example 

INSERT INTO t VALUES(7, 40) 

SELECT * FROM t
SELECT id, count FROM t 

SELECT id, count from t WHERE count > 5 AND id = 9 

UPDATE t SET count=3 WHERE id=5 

DELETE FROM t WHERE count <= 10 OR id = 16