2006-04-26

Python Tips

asyncore.dispatcher

  • 원래부터 nonblocking 이다.
  • set_socket 하는 시점에 map 에 등록된다.

StringIO.readline()

StringIO 는 file-like 객체이므로 readline() 을 지원한다. 그러나 write() 한 후 읽어들이면 None 을 리턴한다. 내부적으로 유지하는 offset 이 하나이기 때문인데, 만약 사용하려면 offset(0) 을 호출해서 포인터를 맨 앞으로 돌려줘야 한다. (너무 단순한가?)

zipfile

zip 포맷으로 특정 폴더를 압축하기 위해서는 다음과 같이 해야 한다. 이때 압축 포맷으로 ZIP_DEFLATED 를 사용해야 파일 크기가 작아진다.

def zipdir(zfile,dir,base='.'):
"""zip directory recursively"""
print '\nzip %s'%dir,

global log
log.write('zip %s...'%dir)

for f in os.listdir(dir):
nf = os.path.join(dir,f)
if os.path.isdir(nf):
zipdir(zfile,nf,os.path.basename(dir))
else:
print '.',
zfile.write(nf,
os.path.join( base, os.path.basename(dir), f),
zipfile.ZIP_DEFLATED)

dict(zip(seq1,seq2))

keys와 values를 dict로 매치시킬 때 dict()와 zip()을 사용할 수 있다.

>>> keys = [ 'aaa', 'bbb', 'ccc' ]
>>> values = [ 1, 2, 3 ]
>>> zip(keys,values)
[('aaa', 1), ('bbb', 2), ('ccc', 3)]
>>> dict(zip(keys,values))
{'aaa': 1, 'bbb': 2, 'ccc': 3}

re.findall

스트링에서 특정 seperator 로 구분된 패턴으로 자를 때, string.split() 도 좋지만 re.findall() 을 강추

>>> args = '"SELECT * FROM User","aaa,bbb,ccc,ddd"'
>>> args.split('"')
['', 'SELECT * FROM User', ',', 'aaa,bbb,ccc,ddd', '']
>>> re.findall('"(.+?)"',args)
['SELECT * FROM User', 'aaa,bbb,ccc,ddd']

re 를 이용한 파일명 변경

특정 폴더 안에 여러가지 파일명들을 바꾸기 위해서는 re 모듈을 잘 사용해야 한다. 다음은 파일명에 {{{[...]}}} 을 없엘 때 쓰는 스크립트이다.

import os, re
os.chdir(target_folder)
for old_name in os.listdir('.'):
new_name = re.sub('\[.+\]','',old_name)
os.rename(old_name,new_name)

comments powered by Disqus