2018년 1월 9일 화요일

Ubuntu 리눅스에서 PDF를 jpg로 변환하는 법

우분투 linux에서 pdf 를 jpg로 변환하는 방법


# imagematick 이 필요
>> sudo apt-get install imagemagick  # imagemagick 설치

# convert 명령어로 변환

>> convert *.jpg out.pdf  # jpg파일을 out.pdf로 생성 또는
>> convert `ls -1v *.jpg` out.pdf  # 시간 순서대로 사진을 정렬해서 pdf 생성


PDF 자체를 jpg로 변환하는 방법은 ubuntu에 있는 imagicmatick을 사용해서
batch로 처리 하는 방법들이 존재

위의 commad와 같음

2018년 1월 7일 일요일

Python dict 와 OrderedDict 형


파이썬에서 주로 사용하는 Dictionary 를 for 문등으로  key값을 불러오면,
key값이 값을 집어 넣은 순서대로 나오는 것이 그때 그때 순서가 바뀌기도 하고
random으로 저장이 되기도 합니다.
즉, 값을 집어 넣은 순서대로 저장되지 않는다인데,

값을 집어 넣은 순서대로 사용하고 싶을 때,
collections에 있는 OrderedDict 을 사용할수 있습니다.

하지만, 이 경우에도 키 값을 집어넣은 순서대로 key를 저장하는 것이라,
iteration되는 키값의 정렬이 필요한 경우에는
OrderedDict 보다는 sorted 구문으로  key를 정렬하는 것이 필요합니다.

OrderedDict의 예제는 아래와 같습니다


from collections import OrderedDict

dt1 = {}
dt1['aaa'] ='NewYork'
dt1['bbb'] ='London'
dt1['ccc'] ='Chicago'
dt1['ddd'] ='Manchester'
dt1['eee'] ='Tokyo'

dt2= OrderedDict()
dt2['aaa'] ='NewYork'
dt2['bbb'] ='London'
dt2['ccc'] ='Chicago'
dt2['ddd'] ='Manchester'
dt2['eee'] ='Tokyo'

dt3= OrderedDict()
dt3['ddd'] ='Manchester'
dt3['aaa'] ='NewYork'
dt3['ccc'] ='Chicago'
dt3['eee'] ='Tokyo'
dt3['bbb'] ='London'

print 'Dictionary\n',dt1.keys()
print 'Dictionary(Sort)\n',sorted(dt1.keys())
print 'OrderedDict\n',dt2.keys()
print 'OrderedDict(Out of order)\n',dt3.keys()

'''
Dictionary
['eee', 'aaa', 'bbb', 'ccc', 'ddd']
Dictionary(Sort)
['aaa', 'bbb', 'ccc', 'ddd', 'eee']
OrderedDict
['aaa', 'bbb', 'ccc', 'ddd', 'eee']
OrderedDict(Out of order)
['ddd', 'aaa', 'ccc', 'eee', 'bbb']

'''

dt1은 순서대로 넣었지만, key를 출력해보면, 순서가 뒤죽박죽이 되어있는 것을 볼 수 있습니다
그래서 dt2처럼 sorting을 해서 정렬시키는 방법이 있고,
dt3과 OrderedDict을 선언하고 순서대로 넣으면 그대로 저장이 되기도하고,
dt4의 경우는 OrderedDict을 선언하더라도, 순서를 뒤죽박죽으로 넣으면,
그 순서대로 저장이 되어있는 것을 볼 수가 있습니다.

즉, 순서를 섞어서 넣는다고 OrderedDict은 알아서 정렬 시켜주는 것이 아니라,
단지 넣은 순서대로 키를 내어주는 역할을 합니다.

그래서, 넣은 순서와 상관없이 키값의 정렬이 필요한 경우에는 OrderedDict보다는 sorted를
사용해야 됩니다.

dict 나 OrderedDict이 비슷하지만 약간의 차이들이 있으므로 그부분을 인식하고 목적에 맞는 사전형 데이터를 쓰시면됩니다.




2018년 1월 2일 화요일

Python Itertools 의 groupby 함수

파이썬 기본 라이브러리인 itertools 안에 가장 요긴한 함수를  하나를 꼽으라면,
전 이걸 뽑습니다.

사용법은 간단하면서도 오묘합니다.

....
from itertools import groupby
import pprint

d = [('Europe','Manchester'),
     ('America','NewYork'),
     ('Asia','Seoul'),
     ('Asia','Tokyo'),
     ('America','Chicago'),
     ('America','Seattle'),
     ('Europe','London'),
     ('Asia','Beijing'),
     ('Europe','Paris'),
     ]

category = {}
for k, g in groupby(sorted(d), lambda x:x[0]):
  listg =[x[1] for x in list(g)] 
  category[k] = listg


pprint.pprint ( category)

'''
{'America': ['Chicago', 'NewYork', 'Seattle'],
 'Asia': ['Beijing', 'Seoul', 'Tokyo'],
 'Europe': ['London', 'Manchester', 'Paris']}
'''

key, group으로 분류를 해줘서  알아서 분류를 다 해서 list로 갖다 바칩니다.
기준을 삼을것을 위 예제에서는 lambda로 구현했지만, 이 부분은 함수가 들어가도 됩니다.
(사용자 정의 분류함수등이 있으면 좋겠네요)

아래는 또다른 예시입니다.
캐릭터 모음이 있는데 이중 직업을 가지고 분류한 예시입니다.



몇줄 되지는 않지만, 그냥 구현 할려면 은근히 귀찮은 부분이 많은 부분을
groupby 하나면, 알아서 분류를 척척척 해주니깐 고맙기짝이 없습니다.

이게 처음에는 좀 익숙하지 않은 부분이 있는데,
익숙해지면 굉장히 라인수를 줄여주는 function중의 하나입니다.

주의할점은 groupby들어가기전에 정렬할 function을 sorting을 한번 해줘야합니다.
그렇지 않으면, group이 여러 개가 생겨서 합치는 작업을 또 해야 되는 점이 있습니다.
하지만, 이걸 파이썬에서 채용하면서 굉장히 유용하게 잘 쓰고 있습니다.

기본 라이브러리이지만,
Pandas에서도 비슷한 기능을 동일한 이름으로 지원하고 있습니다.

다음에는 그 부분에 대해서 적어봐야겠습니다.