设为首页 收藏本站
查看: 2105|回复: 0

[经验分享] 精悍的Python代码段

[复制链接]

尚未签到

发表于 2015-4-21 06:57:51 | 显示全部楼层 |阅读模式
  1 文件处理
  readlines() 和 writelines()方法可以讲列表元素依次写到文件中;
  file类本身没有提供复制方法,可以使用read()和write()方法模拟实现文件的拷贝,也可以使用shutil模块:
  
     shutil.copyfile('hello.txt','hello2.txt')      
shutil.move('hello.txt','../')      
shutil.copyfile('hello2.txt','hello3.txt')
    批量改变当前目录中文件的名字:
  方式一:
  
     files = os.listdir(".")      
for filename in files:      
    pos = filename.find(".");      
    if filename[pos+1:] == 'html':      
        newname = filename[:pos+1] + 'htm'      
        os.rename(filename,newname)
    方式二:
  
     files = os.listdir(".")      
for filename in files:      
    li = os.path.splitext(filename)      
    if li[1] == 'html':      
        newname = li[0] + '.htm'      
        os.rename(filename,newname)
    方式三:
  
     可以使用glob模块中的glob方法获取指定条件的文件列表:
  例如使用l = glob.glob('*.html')获取html为后缀的文件
  l = glob.glob('c:\\w*\\*.txt')获取C盘中w开头目录中所有的文本文件。
    统计文件中指定字符串的数量(是统计字符串而不是单词,字符串可以不是整个单词):
  
     import re      
def str_count(filename,s):      
    count = 0      
    f = file(filename,'r+')      
    for line in f.readlines():      
        li = re.findall(s,line);      
        if li.count(s) > 0:      
            count += li.count(s);      
    f.close()      
    return count
    统计文件中指定单词的数量:
  def word_count(filename,word):   
    count = 0     
    f = file(filename,'r+')     
    for line in f.readlines():     
        p = r'\b'+word+r'\b'     
        print p     
        li = re.findall(p,line);     
        print li     
        if li.count(word) > 0:     
            count += li.count(word);     
    f.close()     
    return count
  修改文件中指定字符串的代码,这里面有两种修改方式,即是否进行全词匹配:
  
     #f1源文件,f2修改后文件,s待修改的字符串,_s为改后字符串,whole是否全词匹配,默认值0代表全词匹配      
def replace_str (file1,file2,s,_s,whole = 0):      
    f1 = file(file1,'r+')      
    f2 = file(file2,'w+')      
    p = r'\b' + s + r'\b'      
    if whole == 1:      
        p = s      
    for line in f1.readlines():   
        t = re.sub(p,_s,line)      
        f2.write(t)      
    f1.close()      
    f2.close()
    difflib是python提供的比较序列(string list)差异的模块。实现了三个类:
  
1>SequenceMatcher 任意类型序列的比较 (可以比较字符串)   
2>Differ 对字符串进行比较     
3>HtmlDiff 将比较结果输出为html格式.             

  
     使用difflib进行序列的比较与结果输出:
  
     import difflib      
from pprint import pprint      
a = 'pythonclub.org is wonderful'      
b = 'Pythonclub.org also wonderful'      
s = difflib.SequenceMatcher(None, a, b)      
print "s.get_matching_blocks():"      
pprint(s.get_matching_blocks())      
print      
print "s.get_opcodes():"      
for tag, i1, i2, j1, j2 in s.get_opcodes():      
    print ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" %  (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2]))
  来看另一个例子:
  def reportSingleFile(srcfile, basefile, rpt):      
    src = file(srcfile).read().split(' ')      
    base = file(basefile).read().split(' ')      
    import difflib      
    s = difflib.SequenceMatcher( lambda x: len(x.strip()) == 0, # ignore blank lines      
        base, src)  
    lstres = []      
    for tag, i1, i2, j1, j2 in s.get_opcodes():      
        print (tag, i1, i2, j1, j2)      
        #print lstres      
        if tag == 'equal':      
            pass      
        elif  tag == 'delete' :      
            lstres.append('DELETE (line: %d)' % i1)      
            lstres += base[i1:i2]      
            lstres.append(' ')      
        elif tag == 'insert' :   
            lstres.append('INSERT (line: %d)' % j1)      
            lstres += src[j1:j2]      
            lstres.append(' ')      
        elif tag == 'replace' :   
            lstres.append('REPLACE:')      
            lstres.append('Before (line: %d) ' % i1)      
            lstres += base[i1:i2]      
            lstres.append('After (line: %d) ' % j1)      
            lstres += src[j1:j2]      
            lstres.append(' ')      
        else:      
            pass      
    print ' '.join(lstres)
  使用Differ进行字符串比较
  import difflib      
diff = difflib.Differ().compare("start up","starT u4p")     
print "\n".join(list(diff))
  使用HtmlDiff进行统计:
  from difflib import *      
s = HtmlDiff.make_file(HtmlDiff(),"start up","storT up")      
f=open(r"C:/dong/result.html","w")      
f.write(s)      
f.close()
  
     越来越发现python非常适合做一些日常开发的工具。平时,我们经常用一些比较工具,比较目录、比较两个文本文件的变化。最近发现,python的标准库里居然带了这些功能的算法。自己处理一下,就可以写出一个很实用的比较工具了。文件和目录比较Module叫做filecmp。最酷的是他提供了一个叫dircmp的类,可以直接比较两个目录。
    目录遍历的三种方式:
  
     1 使用递归函数:     
def visitDir (path):      
    li = os.listdir(path)      
    for p in li:      
        pathname = os.path.join(path,p)      
        if not os.path.isfile(pathname):      
            visitDir(pathname)      
        else:      
            print pathname
  2 使用os.path.walk()
  import os,os.path
  def visitDir (arg,dirname,names):     
    for filepath in names:      
        print os.path.join(dirname,filepath)
  path1 = 'C:\\dong'      
os.path.walk(path1,visitDir,())
  3 使用os.walk()
  def visitDir (path):     
    for root,dirs,files in os.walk(path):      
        for filepath in files:      
            print os.path.join(root,filepath)      

  path1 = 'C:\\dong'      
visitDir(path1)
    自己制作的简单日志记录文件:
  
     #coding=gbk     
import sys,time
  sys.stderr = open("record.log","a")     
f = open(r"hello.txt",'r')      
t = time.strftime("%Y-%m_%d%X",time.localtime())      
context = f.read()      
if context:  #不为空      
    sys.stderr.write(t + " " + context)      
else:      
    raise Exception,t+"异常信息"
    使用Python模拟Java中的输入和输出流:
  
     #coding=gbk     
def FileInputStream (filename):      
    try:      
        f = open(filename)      
        for line in f:      
            for byte in line:      
                yield byte      
    except StopIteration,e:      
        f.close()      
        return      
   
def FileOutputStream (inputStream,filename):      
    try:      
        f = open(filename,'w')      
        while True:      
            byte = inputStream.next()      
            f.write(byte)      
    except StopIteration,e:      
        f.close()      
        return

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58980-1-1.html 上篇帖子: Python的字符串 下篇帖子: Delphi与Python结合
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表