文件切割 python

对文件进形切割的处理  考虑到文件在切的时候,还在边写内容,所以掉了shell脚本


源码如下

原创

配置文件内容

knife.cfg

[split_config]
path=c:\
name=test
suf=txt
size=1
unit=K
count=5



#!/usr/local/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2012-2-15

@author: cooler
'''

import ConfigParser
from datetime import datetime
import os
from os.path import getsize


c_path = "../conf/knife.cfg"

class fileSplit:
    
    c_line = 0; # 当前文件在多少行
    f_count = 1 # 拆装文件后缀
    d_flag = False # 判断文件是否删除
    path = ""
    conf = {}
    
    #获取配置文件信息
    def getCfg(self):
        cp = ConfigParser.ConfigParser()
        cp.read(c_path)
        self.conf["path"] = cp.get("split_config", "path").strip()
        self.conf["name"] = cp.get("split_config", "name").strip()
        self.conf["size"] = cp.get("split_config", "size").strip()
        self.conf["unit"] = cp.get("split_config", "unit").strip()
        self.conf["count"] = cp.get("split_config", "count").strip()
        self.conf["suf"] = cp.get("split_config", "suf").strip()
        #print self.conf["unit"]=='M' ,self.conf["unit"]=='K'
        if(self.conf["unit"]=='M'):
            self.conf['size'] = int(self.conf['size'])*(1024*1024)
        elif(self.conf["unit"]=='K'):
            self.conf['size'] = int(self.conf['size'])*(1024)
        else :
             self.conf['size'] = int(self.conf['size'])*(1024*1024)
    #判断是否超过配置文件大小
    def overSize(self):
        size = getsize(self.conf['path']+self.conf['name']+str(self.f_count)+"."+self.conf['suf'])
        #print size,self.conf['size']
        if(size > int(self.conf['size'])):
            return True
        else :
            return False
    #获取源文件行数
    def getLength(self):
        try:
            fileHandle = open(self.conf['path']+self.conf['name']+"."+self.conf['suf'])
            c_list = fileHandle.readlines()  
            return len(c_list)
        except:
            print " target file is not exist"
    #切割文件
    def knife(self,c_size): 
        try:
            fileHandle = open(self.conf['path']+self.conf['name']+"."+self.conf['suf'])
            c_list = fileHandle.readlines() 
            dtime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            print "has new log  " +  dtime + "  lineCount: " + str(len(c_list))
            for i in range(self.c_line,len(c_list)):
                #print i , (i+1)==len(c_list),len(c_list)
                #if ((i+1)==len(c_list)): # 设置删除文件调剂
                #    self.d_flag = True
                #else :
                #    self.d_flag = False
                self.newFile(c_list[i])
            fileHandle.close() 
            self.c_line = len(c_list) # 一次处理完数据   这个变量可以启用
            self.delContentByNum(0, len(c_list))
        except:
            print "target file is not exist"
    #生成新文件
    def newFile(self,strp):
        try:
            f = file(self.conf['path']+self.conf['name']+str(self.f_count)+"."+self.conf['suf'], r'a') 
            f.write(strp) 
            f.close() 
            if(self.overSize()):
                #if(self.d_flag==False):
                    dtime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                    print "new file dtime:  " +  dtime + "  count : " + str(self.f_count)
                    self.f_count=self.f_count+1
                    if( self.f_count>int(self.conf['count'])):
                            self.removeFile()
                            f = file(self.conf['path']+self.conf['name']+str(self.f_count)+"."+self.conf['suf'], r'a')
                            f.close()
        except:
            print "no such file ~~ new file failure"
    #删除前一个文件
    def removeFile(self):
        try:
            path = self.conf['path']+self.conf['name']+str(self.f_count-(int(self.conf['count'])))+"."+self.conf['suf']
            os.remove(path)
        except:
            print "no such file ~~ remove failure"
    #删除元日志文件的前部分 调用linux命令删除源文件中的内容
    def delContentByNum(self,fromNum,toNum):
        common = "sed -i '"+str(fromNum+1)+","+str(toNum)+"d' " + self.conf['path']+self.conf['name']+"."+self.conf['suf']+""
        os.popen(common)
        self.c_line=0

if __name__ == '__main__':
    fs = fileSplit()
    while True:
        fs.getCfg()
        if(fs.getLength() > fs.c_line):
            #print fs.getLength
            fs.knife(fs.conf['size'])
    #pass
    #os.remove("c:\test2.txt")

你可能感兴趣的:(python)