Python/2.7 for fun.

(편의) 만화책 정리 스크립트.

qkqhxla1 2015. 2. 27. 18:41

가끔 인터넷같은데서 만화를 다운받아서 볼 때가 있는데....


예를 들어 최신에도 계속 나오는 만화같은경우 127화. 128화 이렇게 화마다 폴더가 있다.


그리고 해당 폴더안에는 달랑 사진이 20장 이내로 들어있어서.... 알집으로 보다가 20장이 꽉차면


알집을 다시 끄고 뒤로 한번 온 뒤에 다음 화의 폴더를 누른후 알집이 켜지길 기다려야 한다.


이게 엄청나게 불편하다. 매번 짜증났는데 오늘 할것도없어서 정리해주는 스크립트를 만들어보기로 함.


만화정리.exe

exe를 실행한 후 해당 만화 폴더를 끌어오면 알아서 내부의 .jpg .png의 확장자가 있는 사진파일을들


한 폴더에 다 정리해준다. 나 혼자만 사용하려고 만든거기 때문에 버그가 많을 수 있음.


15/03/01 예외처리 추가. 위의 캡쳐 내용과 일부 실행 결과가 다를 수 있음.


15/06/01 만화책 알고리즘 변경.


15/11/21 일부 에러처리 등 더 개선.



예시.




클레이모어라는 폴더 내부에 저렇게 130화부터 145화까지 있다. 



130화를 예시로 들어가보면 28장밖에 없다. 130화를 보고 131화를 보려면 28장을 본 후에 다시 131화 폴더로 들어가서 알씨든 뭐든 다시 켜야된다. 만화에 집중도가 떨어진다. 한번에 이어서 보려면...




위의 exe를 실행시키고 폴더를 끌어온다음 엔터를 치면 알아서 정리를 해준다. 다시 클레이모어 폴더에 들어가보면 정리라는 파일이 새로 생성됬다.




정리 폴더에 들어가보면 순서대로 잘 정리가 되었음을 확인할 수 있다.

*참고로 정리 순서는 위의 exe를 실행시켰을때 정리중... 이라고 나오는 순서대로 정리된다. 예제로 위의 클*이모어는 130,131,132,133~144,145 순으로 정리됬다.







py2exe options

#-*- coding: cp949 -*-
from distutils.core import setup
import py2exe
 
setup(
     console=['hello.py'],
     options = {'py2exe': {'bundle_files':1,'dist_dir':'python exe','dist_dir':'C:\\Users\\Ko\\Desktop\\python exe',}},
     zipfile = None
     )

코드.

# -*- encoding: cp949 -*-
import os,re,shutil
from operator import itemgetter
while 1:
    d = {}; cnt = 1
    print '만화책 정리 스크립트.\n책 제목에서 처음으로 나오는 숫자로 화, 권을 판별합니다.\n숫자가 없는 화, 권은 숫자 이후에 사전순서대로 이어붙입니다.'
    input_file = raw_input('파일 경로 입력(마우스로 해당 폴더 드래그하면 됩니다) : ')
    if input_file.find('"') != -1:
        input_file = input_file.replace('"','')
    if not os.path.exists(input_file):
        print '파일 경로를 잘못 입력한듯. 파일을 다시 끌어오세요\n'
        continue
    if not os.path.exists(input_file+'\\정리'): os.makedirs(input_file+'\\정리') #해당 경로 내부에 '정리'라는 폴더가 없으면 새로만듬.
    else: 
        jungre = raw_input('\n경로 내부에 \'정리\'라는 이름의 폴더가 없어야 합니다!!!\n정리라는 폴더를 지워버리고 새로 만들까요? y/n')
        if jungre=='' or jungre=='y':
            shutil.rmtree(input_file+'\\정리', ignore_errors=True)
            os.makedirs(input_file+'\\정리')
        else:
            continue
    for all_dirname, inner_dirnames, all_filenames in os.walk(input_file):
        last = 99999
        for i in inner_dirnames:#숫자만 보고 정렬. 그냥 무조건 숫자를 찾아서 첫번째 찾은 숫자대로 정렬.
            try:
                d[int(re.findall('\d+',i)[0])]=i
            except:
                d[last]=i
                last += 1
        s_d = sorted(d.items(), key=itemgetter(0))
        break
    inner_dirnames = []
    for i in range(len(s_d)):
        inner_dirnames.append(s_d[i][1])
    print '\n아래에 목록이 나오는 순서대로 정리됩니다. 순서가 틀린 파일이 있으면 다시 하시기 바랍니다.'
  
    for inn in inner_dirnames:
        if inn!='정리': #해당 내부 폴더가 '정리'폴더가 아니면
            print '\n',inn+' 폴더의 사진을 정리중...'
            p_cnt = 1; inner_file = {}
            for a,i,all_filenames in os.walk(input_file+'\\'+inn):
                for f in all_filenames: #내부에서 모든 파일을 가져와서
                    if f.find('.jpg')!= -1 or f.find('.png')!= -1: #그중 .jpg나 .png가 포함된 사진파일만 가져와서
                        try:
                            num = int(re.findall('(\d+)',f)[0])
                            inner_file[num] = f
                            before = num
                        except:
                            inner_file[before+1] = f
                inner_file = sorted(inner_file.iteritems(), key=itemgetter(0))
                print inner_file
                for j in range(len(inner_file)):
                    if p_cnt%5==0: print
                    print inner_file[j][1]
                    shutil.copy(a+'\\'+inner_file[j][1], input_file+'\\정리\\0000'+str(cnt)+'.jpg') #정리 폴더에 새로 복사. 앞부분의 a는 파일이 들어있는 경로.
                    cnt += 1; p_cnt += 1
    print '\n\n정리 완료!\n'