파이썬에서 파일 복사

폴더마다 같은 종류의 다른 사이즈의 아이콘들이 들어 있는데 이중 48X48 크기의 아이콘들 중 좀 쓸만한 것들을 뽑아서 다른 폴더에 모으려고 했는데, 양이 너무 많았다. 차라리 그 크기의 아이콘들만 모두 모아서 한 곳에 모아두고 보는 게 좋겠다 싶었다.

파이썬은 이럴때 쓰라고 있는 겁니다. 내가 쓰고자 하는 파일들은 모두~”48.png”로 끝나는 파일이라 이 파일들만 복사하면 된다. 특이하게 os 모듈이 아니라 shutil 모듈에 파일 복사 기능이 들어있더라.

#!c:/python27/python.exe

import os
import shutil

DESTDIR = "c:/temp/icons"

def check_condition(filename):
    return filename.endswith("48.png")

def main():
    w = os.walk(".")
    for dir_ in w:
        for file_ in dir_[2]:
            if check_condition(file_):
                shutil.copy(os.path.join(dir_[0], file_), DESTDIR)

if __name__ == "__main__":
    main()

참고로 아래는 프로파일을 측정한 결과. 약 11500여개의 파일을 탐색하고 1600개 가량의 파일을 복사했다. 이걸 손으로 다 뒤질 생각을 했다니;;;;;

1646 files have been copied.
         241158 function calls (234218 primitive calls) in 15.349 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000   15.349   15.349 <string>:1(<module>)
        1    0.027    0.027   15.349   15.349 copy_icons.py:11(main)
    11584    0.010    0.000    0.020    0.000 copy_icons.py:8(check_condition)
    23342    0.018    0.000    0.018    0.000 ntpath.py:122(splitdrive)
     1646    0.015    0.000    0.017    0.000 ntpath.py:164(split)
     1646    0.002    0.000    0.020    0.000 ntpath.py:196(basename)
     1764    0.001    0.000    0.001    0.000 ntpath.py:210(islink)
     3292    0.033    0.000    0.060    0.000 ntpath.py:398(normpath)
     3292    0.004    0.000    0.007    0.000 ntpath.py:42(normcase)
     3292    0.007    0.000    0.095    0.000 ntpath.py:466(abspath)
    18404    0.029    0.000    0.042    0.000 ntpath.py:55(isabs)
    18404    0.063    0.000    0.110    0.000 ntpath.py:63(join)
8706/1766    0.065    0.000    3.110    0.002 os.py:209(walk)
     1646    0.038    0.000   12.185    0.007 shutil.py:111(copy)
     1646    0.017    0.000    7.381    0.004 shutil.py:46(copyfileobj)
     1646    0.010    0.000    0.123    0.000 shutil.py:54(_samefile)
     1646    1.589    0.001   11.471    0.007 shutil.py:66(copyfile)
     1646    0.018    0.000    0.439    0.000 shutil.py:86(copymode)
     1646    0.003    0.000    0.003    0.000 stat.py:21(S_IMODE)
     1693    0.002    0.000    0.002    0.000 stat.py:24(S_IFMT)
     1693    0.003    0.000    0.005    0.000 stat.py:52(S_ISFIFO)
     3292    0.013    0.000    0.013    0.000 {hasattr}
     3292    0.005    0.000    0.005    0.000 {isinstance}
    39803    0.008    0.000    0.008    0.000 {len}
    13348    0.005    0.000    0.005    0.000 {method 'append' of 'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    11584    0.010    0.000    0.010    0.000 {method 'endswith' of 'str' objects}
        1    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}
     3292    0.002    0.000    0.002    0.000 {method 'join' of 'str' objects}
     3292    0.002    0.000    0.002    0.000 {method 'lower' of 'str' objects}
     3292    0.002    0.000    0.002    0.000 {method 'lstrip' of 'str' objects}
     3292    7.349    0.002    7.349    0.002 {method 'read' of 'file' objects}
     6584    0.005    0.000    0.005    0.000 {method 'replace' of 'str' objects}
     3292    0.005    0.000    0.005    0.000 {method 'split' of 'str' objects}
     6584    0.004    0.000    0.004    0.000 {method 'startswith' of 'str' objects}
     1646    0.015    0.000    0.015    0.000 {method 'write' of 'file' objects}
     3292    0.028    0.000    0.028    0.000 {nt._getfullpathname}
    14994    0.643    0.000    0.643    0.000 {nt._isdir}
     1646    0.317    0.000    0.317    0.000 {nt.chmod}
     1765    2.509    0.001    2.509    0.001 {nt.listdir}
     4938    0.260    0.000    0.260    0.000 {nt.stat}
     3292    2.212    0.001    2.212    0.001 {open}