Python에서 Requests모듈을 통해서 json 데이터를 요청하고 받아와서 파싱해보자.


환경 및 선수조건

  • Python(3.X)
  • requests 모듈, json 모듈


Requests?

  • HTTP 통신을 위한 파이썬 라이브러리로 urllib.request처럼 with문 사용없이 직관적으로 사용이 가능합니다.


Requests 기본 사용법

기본 예제

  • 홈페이지에 있는 내용을 그대로 가져왔습니다.
>>> import requests
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

다른 Method를 사용할 때

  • GET, POST, PUT, DELETE, HEAD, OPTIONS가 다 가능합니다.
>>> import requests
>>> r = requests.get('https://api.github.com/events')
>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')


json요청하고 파싱하기

  • 올린 json파일을 HTTP 요청을 통해서 받아오고 그걸 python에서 사용할 수 있는 dictionary형태로 파싱을 하는 코드입니다.

import requests
url = 'https://gist.githubusercontent.com/TWpower/771f9dfc8d9e1ddc0ecbdaea5b2e379e/raw/2c7785b4835138255bdadb71bd83702e53ac2677/test-example.json'

data = requests.get(url).json()


참고자료

한국어가 URL에서 어떻게 표현되는지 알아보자


환경 및 선수조건

  • Percent-encoding의 개념
  • Character Set이 무엇인지


Character Set(Character encoding)이란?

  • Character Set(문자셋) 그리고 Character encoding(문자 인코딩)은 같은 말로 쉽게 말해서 어떤 인코딩 시스템에 의해서 존재하는 문자들을 표현하려는 방법을 의미한다.
  • ASCIIUnicode가 문자 인코딩들의 대표적으로 알려진 예시입니다.


Percent-encoding이란?

  • Percent-encoding이란 URI 혹은 URL에 문자를 표현하는 인코딩 방식으로 RFC 3986에 따라서 알파벳이나 숫자 등 몇몇 문자를 제외한 문자들에 대해서 옥텟 값으로 묶어서 16진수 값으로 코딩하는 방식
  • 예시 : "/internet url" -> "internet%20url"


Percent-encoding의 방법

  • RFC3986문서를 찾아보면 정해진 몇몇개의 문자들을 제외하고는 octet(8bit가 한데 모인 것)으로 인코딩한 후에 %를 붙여서 인코딩 한다고 나와있다.
  • 여기서 한국어는 octet(8bit가 한데 모인 것)으로 변형되어서 표시되며 Unicode에 따라서 UTF-8 방식으로 바뀌어서 인코딩 되게 됩니다.


즉, 다시 정리하면

  • “한국어” -(UTF-8에 따라서)-> “코드화된 한국어” -(1바이트마다 %를 붙임)-> “퍼센트 인코딩된 한국어”
  • 예시 : “각” -(UTF-8에 따라서)-> “0xEA 0xB0 0x81” -(1바이트마다 %를 붙임)-> “%EA%B0%81”


예시

  • “각”의 경우
 /각  =>  /%EA%B0%81
  • “선”의 경우
 /선  =>  /%EC%84%A0
  • “꿳”의 경우
 /꿳  =>  /%EA%BF%B3


참고자료

Linux 기반 운영체제나 Mac OS에서 파일을 16진수나 2진수 형태로 볼 수 있는 xxd 명령어의 사용법과 예제를 보자


환경 및 선수조건

  • Linux
  • Mac OS


xxd

  • xxd : 주어진 파일이나 standart input으로 들어온 문자들에 대해서 hex dump(컴퓨터 데이터의 16진법적인 보임새)를 만들어 준다. Endian에 관계 없이 파일에 존재하는 순서대로 나옵니다.

  • 기본 사용법 : xxd [file name]


xxd의 예제와 옵션

기본 파일 생성

  • 아래와 같이 test.txt라는 UTF-8 형식의 파일을 만들고 예제를 보여드리겠습니다. 파일의 내용도 아래에 첨부합니다.
  • test.txt 링크 : https://gist.github.com/c3af533139621a58f3f9051e6a09bc6f.git
  • file 명령어 다음에 파일명을 입력하면 파일의 형식에 대해서 간략하게 보여줍니다.
$ touch test.txt
$ vim test.txt

... # 텍스트들 입력 후

$ file test.txt
test.txt: UTF-8 Unicode text, with very long lines


기본 사용법 및 예제

  • xxd [파일명]
$ xxd test.txt

xxd-example

  • 제일 좌측에 파일의 상대주소가 나옵니다.
  • 기본적으로 2바이트씩 묶어서 보여줍니다.
  • 기본적으로 1줄은 16바이트씩 나타납니다. 나중에 사용하는 옵션에 따라서 다르게 나오기도 합니다.
  • 제일 우측에는 ASCII형태로 각 바이트의 값들을 보여줍니다.


옵션에 따른 사용법 및 예제

  • -b : bit로 표시해줍니다.
$ xxd -b test.txt

xxd-example-b

  • -c <cols> : 한 줄에 몇개의 바이트를 표현할지 <cols> 값으로 정합니다.
$ xxd -c 8 test.txt

xxd-example-c

  • -e : 우측에 나타나는 값들이 ASCII가 아닌 EBCDIC로 합니다.
$ xxd -e test.txt

xxd-example-e

  • -g <bytes> : <bytes>에 들어가는 값만큼 묶어서 표현하며 기본 값은 2입니다.
$ xxd -e test.txt

xxd-example-e

  • -l <value> : <value>만큼만 hexdump를 합니다.
$ xxd -l 0x10 test.txt

xxd-example-l

  • -p : 포맷이 없는 hexdump를 출력합니다.
$ xxd -p test.txt

xxd-example-p

  • -s <offset> : <offset>의 위치부터 hexdump를 보여줍니다.
$ xxd -s 0x80 test.txt

xxd-example-s

  • -u : byte를 대문자로 출력합니다.
  • 그 외에 -r-seek <offset>가 있는데 각각 -r은 hexdump를 binary로 바꾸는 명령어이며 -seek <offset>-r와 관련해서 파일 포지션을 정해주는 옵션입니다.


참고자료

C++에서 fill 함수를 사용해보자


환경 및 선수조건

  • C++


목적

  • fill함수는 어떤 연속성을 띈 자료구조(벡터나 배열 같은)의 시작점부터 연속된 범위를 어떤 값이나 객체로 모두 지정하고 싶을 때 사용하는 함수이다.


기본 함수 구조 및 매개변수

#include <algorithm>

void fill (ForwardIterator first, ForwardIterator last, const T& val);
  • #include <algorithm> : fill함수를 사용하기 위해 필요한 헤더파일
  • first : 채우고자 하는 자료구조의 시작위치 iterator
  • last : 채우고자 하는 자료구조의 끝위치 iterator이며 last는 포함하지 않는다!
  • val : first부터 last전까지 채우고자 하는 값으로 어떤 객체나 자료형을 넘겨줘도 템플릿 T에 의해서 가능하다.


코드

  • 코드
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main () {

	// 백터 생성
	vector<int> v(8);

	// 1번째 위치부터 4번째 위치까지 1로 할당
	fill (v.begin(), v.begin()+4, 1);

	// 5번째 위치부터 끝까지 2로 할당
	fill (v.begin()+4, v.end(), 2);

	cout << "v contains :";
	for (vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
		cout << ' ' << *it;
	cout << '\n';


	// 배열 생성
	int a[8] = {0,};

	// 1번째 위치부터 4번째 위치까지 1로 할당
	fill (a, a + 4, 1);

	// 5번째 위치부터 끝까지 2로 할당
	fill (a + 4, a + sizeof(a)/sizeof(int), 2);

	printf("a contains :");
	for (int i = 0; i<sizeof(a)/sizeof(int); i++)
		printf(" %d", a[i]);
	printf("\n");

	return 0;
}


참고자료

Python에서 in 연산자의 시간 복잡도에 대해서 알아보자


환경 및 선수조건

  • Python(3.X)


파이썬 in 연산

  • 파이썬 in연산자란 멤버십 연산자로 문자열이나 리스트나 튜플과 같이 연속적인 자료구조에 속한 멤버를 확인하기 위한 연산자입니다.


기본 사용법

list


l = [1, 2, 3, 4, 5]

# 멤버 확인
if 1 in l :
    print("1 is in l")

# 순회
for i in l :
    print(i)

tuple


t = (1, 2, 3, 4, 5)

# 멤버 확인
if 1 in t :
    print("1 is in t")

# 순회
for i in t :
    print(i)

set


s = {1, 2, 3, 4, 5}

# 멤버 확인
if 1 in s :
    print("1 is in s")

# 순회
for i in s :
    print(i)

dictionary keys


d = {1 : 'a', 2 : 'b', 3 : 'c', 4 : 'd', 5 : 'e'}

# 멤버 확인
if 1 in d.keys() :
    print("1 is in d keys")

# 순회
for i in d.items() :
    print(i)


시간 복잡도

list, tuple

  • Average : O(n)
  • 하나하나 순회하기 때문에 데이터의 크기만큼 시간 복잡도를 갖게 됩니다.

set, dictionary

  • Average : O(1), Worst : O(n)
  • 내부적으로 hash를 통해서 자료들을 저장하기 때문에 시간복잡도가 O(1)가 가능하고 O(n)의 경우에는 해시가 성능이 떨어졌을(충돌이 많은 경우) 때 발생합니다.


참고자료