본문 바로가기
프로그래밍/Python

file name encoding converter

by DaRyun 2014. 1. 22.

Samba로 윈도우/리눅스 파일을 옮기다 보면 cp949와 utf-8 인코딩된 파일/디렉토리 이름들 때문에 짜증이 날때가 있다. 원래는 그냥 그러려니 하고 썼었는데 파일/디렉토리 이름을 서브 디렉까지 찾아서 일괄 변환하는 파이썬 코드를 한번 짜봤다.

나중에 Tkinter 기반으로 유틸처럼 보이게 만들어야 겠다.

근데 지금도 내가 쓰는덴 큰 불편을 못느껴 바꿀 필요는 못 느낀다.

bitbucket에 python accessory utility 프로젝트라도 운영해야 하나...

todo.

    Tkinter GUI 화면 구성.

    ini 파일로 최종 선택 저장.

    Windows 환경에서 사용할 수 있는 방법은 없나?

    => 윈도의 경우 utf-8 이름으로 파일 create할때와 os.rename 에서 WindowsError exception을 던진다. cp949 encode에서도 에러다. Mac의 경우는 테스트 못했다. 맥북프로 하나 있음 해볼거 많은데...ㅠ.ㅠ

1 import os 2 3 #select = 'u2c' # utf-8 to cp949, linux to windows 4 select = 'c2u' # cp949 to utf-8. windows to linux 5 6 curdir = r'/media/shareddisk/tmp/testdir' # 변환 디렉토리 7 8 # select : (from, to) 9 direction = {'u2c':('utf-8', 'cp949'), 'c2u':('cp949', 'utf-8')} 10 11 12 def rename(fromname, toname): 13 try: 14 os.rename(fromname, toname) 15 except: 16 print '[ERR]os.rename %s => %s' % (fromname, toname) 17 return 18 19 def encode_name(name): 20 name2 = unicode(name, direction[select][0]).encode(direction[select][1]) 21 22 return name2 23 24 from sys import platform as _platform 25 26 dirlist = [] 27 28 if _platform == "win32": 29 print '[ERR]NOT Support windows system' 30 elif _platform == "darwin": 31 print '[ERR]NOT Support mac' 32 elif _platform == "linux" or _platform == "linux2": 33 os.chdir(curdir) 34 35 pwd = os.getcwd() 36 print 'convert start =>', pwd 37 38 for dirname, dirnames, filenames in os.walk(pwd): 39 for subdirname in dirnames: 40 name = os.path.join(dirname, subdirname) 41 dirlist.append(name) 42 43 for oldName in reversed(dirlist): 44 pname, fname = os.path.split(oldName) 45 try: 46 newName = os.path.join(pname, encode_name(fname)) 47 rename(oldName, newName) 48 except: 49 print '[ERR]encode %s' % fname 50 51 for dirname, dirnames, filenames in os.walk(pwd): 52 for filename in filenames: 53 try: 54 newName = os.path.join(dirname, encode_name(filename)) 55 oldName = os.path.join(dirname, filename) 56 rename(oldName, newName) 57 except: 58 print '[ERR]encode %s' % filename


댓글