zipfile을 이용하면 zip 파일의 압축을 해제할 수 있다.

 

파일이 한글일 경우 깨짐 현상이 발생하는데,

구글링하면 이를 해결한 글을 찾을 수 있다.

http://www.hanbit.co.kr/media/channel/view.html?cms_code=CMS8947142043

 

파이썬을 사용해 한글 파일명을 포함한 ZIP 파일 압축 해제

ZIP 압축과 인터넷 인터넷을 사용하는 인구가 늘면서 많은 사람이 대용량의 파일을 주고 받기 시작했다. 인터넷 이전의 지역적인 통신망이었던 PC 통신에서도 여러 개의 파일을 주고 받기 위해 다양한 압축 유틸리티가 사용되었다. 많은...

www.hanbit.co.kr

 

그런데 python 2.x만 가능하고, python 3.x에는 적용되지 않는다.

python 3.x 관련글을 찾으려 했으나, 아무런 포스팅이 없다.

 

그래서 이래저래 찾아본 결과 해결책을 찾을 수 있었다.

결과적으로

기존 member.filename = member.filename.decode("euc-kr").encode("utf-8")를

member.filename.encode('cp437').decode('euc-kr')로 변경하면 된다.

 

풀 코드는 아래처럼 쓰면 된다.

(참고로 이전 글의 함수에서 dest_path 기능이 없길래 추가했다.)

def unzip(source_file, dest_path):
    with zipfile.ZipFile(source_file, 'r') as zf:
        zipInfo = zf.infolist()
        for member in zipInfo:
            try:
                print(member.filename.encode('cp437').decode('euc-kr', 'ignore'))
                member.filename = member.filename.encode('cp437').decode('euc-kr', 'ignore')
                zf.extract(member, dest_path)
            except:
                print(source_file)
                raise Exception('what?!')

 

하지만 euc-kr로 표현되지 않는 파일명은 여전히 깨지긴한다.

https://code.i-harness.com/ko-kr/q/567710

https://stackoverflow.com/questions/5666576/show-the-progress-of-a-python-multiprocessing-pool-map-call

개념


자료형 : https://blog.colab.kr/2

언더스코어(_) 개념 : https://mingrammer.com/underscore-in-python/

getter/setter 필요성 : https://mygumi.tistory.com/161




기본 모듈/함수


파일 경로 : https://hashcode.co.kr/questions/197/python%EC%9C%BC%EB%A1%9C-%ED%98%84%EC%9E%AC-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EC%9C%84%EC%B9%98%EB%A5%BC-%EC%95%8C%EC%95%84%EB%82%B4%EB%8A%94-%EB%B0%A9%EB%B2%95

UUID : https://code.tutsplus.com/ko/tutorials/quick-tip-how-to-create-a-universally-unique-identifier-in-python--cms-25927



VS Code와 Anaconda 환경이 설치되어있어야함.


Ctrl + Shift + P 로 커맨드 열기.

사용하고 싶은 Anaconda 환경 선택.


잘 됬는지 확인하고 싶으면, VS code내 터미널에서 확인하면됨

학교 과제할 때

한글(HWP) 파일 등으로 코드를 복사할 일이 많은데,

컨CV하면 형식도 안맞고, 모양도 별로인 경우가 많다.


이때 HTML로 복사하는 기능을 알면 상당히 깔끔하게 복사할 수 있다.


pycharm 뿐만 아니라 여러 에디터에서 이 기능을 지원하니, 잘 찾아보자

pycharm의 경우는

File - export to html 이라는 기능을 통해 할 수 있다.

저 버튼을 누르고, 옵션 확인후 export하면

html 파일이 만들어진다.


그리고 html 파일을 들어가서 복사한 뒤 한글에 붙여넣으면 된다.

매우 쉬움.

사실 pycharm가 번거로운 경우이고, 다른 에디터들은 바로 html 형식으로 클립보드에 복사할 수 있다.


아 그리고 한글에 붙여넣을 때는 '원본 형식 유지'로 붙여넣어야한다.

2to3 -w 파일명  # 해당 파일 변환

2to3 -w .\        # 현재 폴더의 모든 파일 변환


위 코드를 실행하면 .bak 파일(원본)이 생김

-n 옵션을 추가하면 .bak 파일 생성을 막음

pyplot을 이용하여 영상을 저장하려고 했으나,

계속해서 공백이 생겨서 애먹었다.


구글링하면 일반적으로 tight_layou() 등의 함수를 말하는데, 씨알도 안먹힌다.

결국 이것저것 삽질하면서 다양한 공백이 있다는걸 발견했다..


1. axis 공백 (왼쪽과 아래쪽 공백)

이건 axis('off') 코드를 이용해서 없앤줄 알았으나

축 값만 안보일 뿐, 축 값들이 차지하던 공간은 그대로 남아있다.

이걸 없애려면 아래 코드를 사용해야한다.

fig.axes.get_xaxis().set_visible(False)

fig.axes.get_yaxis().set_visible(False)


만약 axis 객체를 사용한다면 (ex subplot)

ax.axes.get_xaxis().set_visible(False)

ax.axes.get_yaxis().set_visible(False)


2. padding으로 인한 공백

save 옵션에 tight를 추가해도 공백은 여전하다.

이는 padding이 존재해서 발생하는 문제다.

따라서 저장 시 padding=0 옵션을 추가해주면 해결된다.


plt.savefig(fname='image.jpg', bbox_inches='tight', pad_inches=0)




아래 링크는 그냥 pyplot 사용법


https://datascienceschool.net/view-notebook/d0b1637803754bb083b5722c9f2209d0/

pip install graphviz easydev


node와 edge로 이루어진 그래프를 만들며,

간단한 코드로 시각화가 가능하다.


documents

https://graphviz.readthedocs.io/en/stable/



아래는 간단한 시각화 예시를 작성한 것이다.
sg = gv.Digraph() # 그래프 생성
anns_rel_n2c = annotation_util.get_rel_n2c()

for obj_idx, obj_info in enumerate(scene_info['visible_object']): # object node, 속성 node/edge 추가
    with sg.subgraph(name=str(obj_idx)) as obj_g:
        obj_g.node(str(obj_info['id']), label=obj_info['name'], shape='box')
        # is_open 추가
        obj_g.node(str(obj_info['id'])+'_isOpen', label={-1:'o_un', 0:'close', 1:'open'}[obj_info['is_open']], shape='ellipse', style='filled', color='lightgrey')
        obj_g.edge(str(obj_info['id'])+'_isOpen', str(obj_info['id']), dir='none')

        # color 추가
        obj_g.node(str(obj_info['id']) + '_color', label=obj_info['color'], shape='ellipse', style='filled', color='lightgrey')
        obj_g.edge(str(obj_info['id']) + '_color', str(obj_info['id']), dir='none')

for relaion in scene_info['relaion']: # 관계 edge 추가
    sg.edge(str(relaion['subject_id']), str(relaion['object_id']), label='  '+anns_rel_n2c[relaion['rel_class']])

sg.render('./gv_temp.gv', view=True, cleanup=True) # 랜더링


pip install colormap


documents

https://colormap.readthedocs.io/en/latest/


colormap.rgb2hsv 등의 함수가 구현되어있어서, 쉽게 변환이 가능하다.


함수들에 대한 인자는 tuple이며,

output 역시 numpy가 아닌 단순 list이다.


유의해야할 점은

rgb2hex 함수는 0~255 값을 입력 받는데,

rgb2hsv 함수는 0~1 값을 입력받는다.


왜 이렇게 구현해놓은 지는 잘 모르겠다.. 너무 불편..

https://github.com/ethereon/lycon


사이트 아래쪽에 테이블로 잘 비교되어있다.

측정된 값이 확실치는 않음


결과적으로는

OpenCV >>>>>> Pillow >>>>>>>>>>>>>>>>>>> Scikit-Image


opencv가 압도적으로 빠르다

pillow가 제일 빠를 줄 알았는데..

앞으론 opencv만 써야겠다

pip install pandas

로 간단히 설치 가능


pandas는 DataFrame 이라는 객체를 통해, 데이터들을 처리함.


### 기본 사용법 ###

import pandas as pd # np, tf처럼 대개 pd라고 사용

# DataFrame 생성 코드.   인자로 초기화값과 인덱스 값을 넣어주면 해당 크기만큼 초기화된 df를 얻을 수 있음
# 보통 DataFrame은 df라고 줄여서 표현
df = pd.DataFrame(columns=['ID', 'value'])

# 데이터 삽입 예시.   python의 append와는 다르게 반환값으로 다시 갱신해줘야함
df = df.append({'ID':'hi', 'value':50}, ignore_index=True)

# 다양한 연산자 제공. append와 마찬가지로 반환값을 통해 갱신이 필요함
df.mean(), df/10, df.round(2)

# df 분할
id_df = df.iloc[:, 0]
value_df = df.iloc[:, 1:]

# df 병합. DB에서 배운 join 등의 연산도 가능함. 검색하면 다나옴
df = pd.concat([label_df, value_df], axis=1, sort=False)

# df 객체의 value들을 numpy 배열로 반환해줌
df.values


### csv 파일 처리 ###

# csv 파일 로드 예시. index_col은 0번째(첫번째) 줄의 값들을 column id로 사용하겠다는 의미.
# index_col 값을 0으로 줘야할 때는 굳이 안써줘도 알아서 잘됨 (예시를 위해 넣음)
df = pd.read_csv(os.path.join(dataDir, 'train.csv'), low_memory=False, index_col=0)

# df로부터 csv파일 저장.
# header는 column들의 id 값 표시 여부
# index는 row들의 id 값 표시 여부
df.to_csv("filename.csv", mode='a', header=True, index=False)


1. PIL (Python Imaging Library) 

[한글위키 : https://ko.wikipedia.org/wiki/Python_Imaging_Library]

    파이썬 1.5~2.7 지원

    우분투에서 지원이 안되고, PIL 대신 후속 버전인 Pillow를 많이 사용함


2. Pillow

[사이트 : https://pillow.readthedocs.io/en/3.1.x/index.html#]

    PIL의 후속 버전으로, 파이썬 3.6까지 지원한다.

    PIL의 기능을 포함하며, improt PIL도 가능.

    설치 : pip install pillow


3. OpenCV 

[영문위키 : https://en.wikipedia.org/wiki/OpenCV]

[사이트 : https://opencv.org/]

    인텔이 개발한, 영상 처리 라이브러리. 크기가 크며 다양한 기능을 제공

    설치 시, conda/pip install로 설치할 수 있지만, ffmpeg 기능을 지원하지 않아, 동영상 처리가 안된다.

    cv와 cv2로 나누어지는데, cv 옛날 버전이고 더이상의 업데이트가 없다.

    cv2는 최신 버전이고, cv를 포함한다. 또한 데이터들을 numpy로 처리하는 특징이 있다.

    python에서 opencv를 사용한다는건, import cv2로 봐도 무방한 것 같다.

    설치 : 1. 직접 빌드하여 설치 [ffmpeg 기능 추가 가능]

            2. conda install -c menpo opencv [ffmpeg 기능 X]

            3. pip install opencv-python [ffmpeg 기능 X]


4. scikit-image (skimage)

[사이트 : http://scikit-image.org/]

    numpy와 scipy를 사용하는 영상 처리 라이브러리. (두 라이브러리 설치가 필요함)

    scikits.image에서 시작해서, 지금은 독립적으로 개발된다고 한다.

    설치 : pip install scikit-image


5. scikit-video (skvideo)

[사이트 : http://www.scikit-video.org/stable/io.html]

    4번과 동일한 맥락이지만, 동영상을 다룬다는 점이 다르다.

    opencv로 동영상을 처리하기가 좀 까다로운데, 이 라이브러리를 사용하면 쉽게 처리할 수 있다.

    FFmpeg 또는 LibAV를 기반으로 동영상을 처리한다. 따라서 ffmpeg 설치가 필요함

    설치 : sudo apt-get install libav-tools

            pip install scipy skvideo or scikit-video or sk-video

1. 터미널에서 source 명령어로 가상환경 활성화

2. conda install nb_conda

3. jupyter notebook


import numpy as np


data = np.arange(100) # 저장하는 데이터


np.save('my_data.npy', data) # numpy.ndarray 저장. @파일명, @값


data2 = np.load('my_data.npy') # 데이터 로드. @파일명



위와 같이 쓰면 된다.

매우 간단함

(파이썬3 폴더)\Tools\scripts 에 들어갑니다.

(필자의 경우 C:\Python36\Tools\scripts)


변환할 python2 코드 파일(.py)을 위 폴더에 넣어줍니다.


cmd 창을 열어주고 다음 명령어를 입력합니다.

python 2to3.py -w (변환할파일명)

ex) python 2to3.py -w p2file.py


변환하기 위해 넣었던 파일이 python3로 변환됩니다.

import time


start_time = time.time()

######

######

######

print 'run time :', round(time.time()-start_time, 3) # round 함수는 소수점 3자리만 출력하기 위해서 씀

파이썬 내에서 opencv를 통해 비디오를 수정하려고 했지만

ffmpeg 설치가 너무너무 안되서 skvideo.io 라는 대안책을 찾았다 ㅠㅠ


설치

sudo apt-get install libav-tools

pip install sk-video (scikit-video는 구버전)


사용법

import skvideo.io


vid = skvideo.io.vread('sample.mp4') # 비디오를 읽어옴

vid.shape # (프레임 수, Y, X, channels)


for i, shortcut in enumerate(vid): # 각 프레임 조회

print shortcut # example code


opencv가지고 이틀 내내 앓았는데 너무 통쾌하다 ㅠㅠ

skvideo 사이트가서 확인법좀 익혀야겠다.



참고로 opencv에서 비디오를 가져올 때


import cv2

vid = cv2.VideoCapture('sample.mp4')

if vid.isOpened():

###


위 코드가 거의 정석이다.

그런데 오류는 안나지만 isOpened() 요놈이 항상 False를 리턴한다.

그 이유는 opencv가 ffmpeg 패키지를 내포하지 않기 때문이다.

ffmpeg란 동영상를 다룰 수 있게 해주는 파이썬 패키지인데, 기본적으로 opencv는 이걸 사용 안하는 모드로 설치된다.

ex) pip install -c menpo opencv # -> ffmpeg가 설치 안됨 ㅠㅠ

이를 해결하기 위해 직접 opencv 파일을 받고 build.sh 파일을 수정(WITH_FFMPEG=ON)하여 make or conda-build 하고

그 결과 파일을 가지고 install 해야하는데...

남들은 잘된다는데 나는 계속 오류가난다..

컴 2대로 테스트했는데 둘 다 다른 오류에다가 오류 넘어 오류로 포기했다 ㅂㄷㅂㄷ


pip freeze


설치된 모듈 이름과 각 버전 리스트가 출력된다.

매우 유용함 굳

'실습 > python' 카테고리의 다른 글

python 시간 측정  (0) 2017.07.23
[skvideo] python에서 비디오(동영상) 파일 다루기  (0) 2017.07.23
print() 함수 사용법 및 문자열 표현법  (0) 2017.06.11
matplotlib.pyplot 모듈 함수 정리  (0) 2017.06.11
[basic] pip란?  (0) 2017.06.09

python 2.X


print '출력문'

꼴로 작성된다.



python 3.X


print('출력문')

꼴로 작성한다.



python 3.6.1을 사용하기 때문에 이를 기준으로 설명한다.


먼저 3.X 버전이므로 기본적으로 print() 의 괄호 안에 출력문을 넣는다.


그 안에 변수든, 문자열이든, 리스트든 뭐든 들어갈 수 있다.


그 중 문자열에 대해 정리해 보았다.



print('문자열')

>> 문자열


print('문' + '자' + '열')

>> 문자열


print('문', '자', '열')

>> 문 자 열


print('%s' % '문자열')

>> 문자열


print('%s%s%s' % ('문', '자', '열'))

>> 문자열


print('%(a)s%(b)s%(c)s' % {'b':'자', 'c':'열', 'a':'문'})

>> 문자열


print('{}'.format('문자열'))

>> 문자열


print('{}{}{}'.format('문','자','열'))

>> 문자열



c언어 덕에 %가 익숙한데, 이 방법은 옛날 방법이고

{} .format 을 쓰는 방법이 최근의 방법이라고 한다.


http://cafe.naver.com/ugcadman/165


텐서플로 공부하는데 상당히 많이 등장해서 찾아보았다

함수들의 의미가 잘 정리되어있다.

+ Recent posts