关于字符串和文件操作的几个函数

上次发的格式不知道为什么在Chrome上乱掉了,这次加了几个重发.
# -*- coding: UTF-8 -*-
'''
Created on 2010-12-27

@author: sumory
'''
import itertools


def a_containsAnyOf_b(seq,aset):
    '''判断seq中是否含有aset里的一个或者多个项
        seq可以是字符串或者列表
        aset应该是字符串或者列表'''
    for item in itertools.ifilter(aset.__contains__,seq):
        return True
    return False



def a_allIn_b(seq,aset):
    '''判断seq中的所有项是否都在aset里
        seq可以是字符串或者列表
        aset应该是字符串或者列表'''
    for item in seq:
        if item not in aset:
            return False
    return True



def a_containsAll_b(seq,aset):
    '''判断seq是否包含aset里的所有项
       seq可以是字符串或者列表
       aset应该是字符串或者列表
                  任何一个set对象a,a.difference(b)等价于a-set(b),即返回a中所有不属于b的元素'''
    return not set(aset).difference(seq)



import string

#生成所有字符的可复用的字符串
sumory_allchars=string.maketrans('','')
def makefilter(keep):
    '''返回一个函数,此函数接受一个源字符串作为参数\
            并返回字符串的一个部分拷贝\
            此拷贝只包括keep中的字符,keep必须是一个普通的字符串\
           调用示例:makefilter('abca ')('abcdefgh ijkal cba')在后面的字符串中保留前面出现的字符  abc a cba
    '''
    #按照sumory_allchars规则剔除sumory_allchars字符串中的keep里的字符,这里得到keep在sumory_allchars的补集
    deletechars=sumory_allchars.translate(sumory_allchars,keep)
    #生成并返回需要的过滤函数(作为闭包)
    def realdelete(sourseStr):
        return sourseStr.translate(sumory_allchars,deletechars) 
    return realdelete



def list_removesame(list):
    '''删除list中的重复项'''
    templist=[]
    for c in list:
        if c not in templist:
            templist.append(c)
    return templist



def re_indent(str,numberofspace):
    '''
            缩进\
            将字符串str中按换行符划分并在每句前加上numberofspace个space,再组合成字符串'''
    spaces=numberofspace*' '
    lines=[spaces+line.strip() for line in str.splitlines()]
    return '\n'.join(lines)



def replace_strby_dict(sourseStr,dict,marker='"',safe=False):
    '''使用字典替换源字符串中的被marker包裹的相应值'''
    
    #如果safe为True,那么字典中没找到key时不替换
    if safe:
        def lookup(w):
            return dict.get(w,w.join(marker*2))#w.join(marker*2)用marker包裹w
    #如果safe为False,那么字典中没找到key时抛异常,若将dict[w]换为dict.get(w)则没找到时返回None
    else:
        def lookup(w):
            return dict[w]
    #根据marker切分源字符串
    splitparts=sourseStr.split(marker)
    #取出切分后的奇数项,因为切分后,列表中源字符串中marker包裹的项肯定位于基数部位
    #就算是'"first"s is one'这样的字符串也是如此,分割后的第0项为空串,第1项为first
    splitparts[1::2]=map(lookup,splitparts[1::2])
    return ''.join(splitparts)



def simply_replace_strby_dict(sourseStr,dict,safe=True):
    '''根据dict内容替换sourseStr原串中$标记的子字符串\
    dict= {'name':'sumory','else':'default'}
    $$5 -> $5
    $else -> default
    ${name}'s method -> sumory's method
    '''
    style=string.Template(sourseStr)
    
    #如果safe,在dict中找不到的话不会替换,照样保留原串
    if safe:
        return style.safe_substitute(dict)
    #false,找不到会抛异常
    else:
        return style.substitute(dict)



############################################################

def scanner(object,linehandler):
    '''用linehandler方法遍历object的每一项'''
    for line in object:
        linehandler(line)
        

def printfilelines(path):
    '''读取path路径下的文件屏逐行打印'''
    fileobject=open(path,'r')#open不用放到try里
    try:
        for line in fileobject:
            print(line.rstrip('\n'))
    finally:
        fileobject.close()

def writelisttofile(path,ilist):
    fileobject=open(path,'w')
    try:
        fileobject.writelines(ilist)
    finally:
        fileobject.close()

import zipfile
def listzipfilesinfo(path):
    z=zipfile.ZipFile(path,'r')
    try:
        for filename in z.namelist():
            bytes=z.read(filename)
            print('File:%s Size:%s'%(unicode(filename, 'cp936').decode('utf-8'),len(bytes)))
    finally:
        z.close()



import os,fnmatch
def list_all_files(root,patterns='*',single_level=False,yield_folders=False):
    '''列出目录(或者及其子目录下的文件)'''
    #分割模式到列表
    patterns=patterns.split(';')

    for path,subdirs,files in os.walk(root):
        if yield_folders:
            files.extend(subdirs)
        files.sort()
        for name in files:
            for pat in patterns:
                if fnmatch.fnmatch(name, pat):
                    yield '/'.join(unicode(os.path.join(path,name),'cp936').split('\\'))
                    break
        if single_level:
            break


def swapextensions(root,before,after):
    if before[:1]!='.':
        before='.'+before
    extensionlen=-len(before)
    if after[:1]!='.':
        after='.'+after
    for path,subdirs,files in os.walk(root):
        for oldfile in files:
            if oldfile[extensionlen:]==before:
                oldfile=os.path.join(path,oldfile)
                newfile=oldfile[:extensionlen]+after
                os.rename(oldfile, newfile)
posted @ 2010-12-30 16:17  sumory  阅读(307)  评论(0编辑  收藏  举报