Python 大文件分割http://blog.csdn.net/gashero/category/173657.aspx

 

# -*- coding: utf-8 -*-
import os,sys,getopt
srcFilename='D:/kk/log.trace'
#try:
inputf=open(srcFilename,'r')
File_i=0
lines=0
Head=True
Linecount=5
HeadStr='begin'

#if Head:
#    HeadStr=inputf.readline()
outputf=open(os.path.dirname(srcFilename)+ os.sep + /
os.path.splitext(os.path.basename(srcFilename))[0] + '_' + str(File_i)+ /
                os.path.splitext(os.path.basename(srcFilename))[1],'w')

print outputf

   

for eachline in inputf:
    outputf.write(eachline)
    lines+=1
    if lines==Linecount:
        print u'分割子文件%s完毕;' % outputf.name
        outputf.close()
        File_i+=1
        lines=0
        outputf=open(os.path.dirname(srcFilename)+ os.sep + /
        os.path.splitext(os.path.basename(srcFilename))[0] + '_' + str(File_i)+ /
                        os.path.splitext(os.path.basename(srcFilename))[1],'w')
    if Head:
        outputf.write(HeadStr)
if not outputf.closed:
    print u'分割成功,共分割成为%s个文件' % str(outputf.name)
    outputf.close()


inputf.close()

//

我们知道,一个EXCEL文件单表行数最多是65536行,超过这个行数,就无法再EXCEL中显示,在日常工作中,很多情况下需要对从数据库中提取超大行数的数据进行EXCEL操作,所以我就想到了用python先把大文件进行分割处理,这样就可以解决这个矛盾了,说干就干。

先说说思路,首先让程序具有接受输入文件名作为参数的功能,这样以后可以处理不同的文件了,而且行数自定义,关键还有一个,就是行首作为每个文件的行首。先确定这3个功能吧,大致有就够用了

然后开始写程序,源程序为:

#源文件开始  FILENAME=splitFile.py

# -*- coding: utf-8 -*-
def usage():
    print u"""
使用帮助:
SplitFile <文件名>  [行数] [-L 行数] [-H]
   <文件名>   :必选参数;要分割的文件的名字;
   [-L 行数]  :可选参数;以此行数来对源文件进行分割;默认5万;
   [-H]       :分割后的文件都加上首行;
                       
示例:要把C盘的myfile.csv以6万行分割,且首行为标题行,
命令为:splitfile c:/myfile.csv -L 60000 -H
        """
def main():
    import sys,getopt,os
    #判断是否输入要处理的文件名字
    if len(sys.argv)<2:
        usage()
        sys.exit(1)
    #如果文件名字不包含全路径,则默认为当前目录
    srcFilename=sys.argv[1]
    if os.sep not in srcFilename:
        srcFilename=os.getcwd()+os.sep+srcFilename
    #判断文件是否存在
    if not os.path.exists(srcFilename):
        print u'您输入的文件文件名称有误!'
        usage()
        sys.exit(1)
    #开始对参数进行处理
    try:
        opts,args=getopt.getopt(sys.argv[2:],'lL:hH')
    except getopt.GetoptError:
        print u'命令行格式有误!'
        usage()
        sys.exit(2)
    Head=False #是否包含首行
    Linecount=50000 #默认切割行数
    for o,a in opts:
        if o=='-h' or o=='-H':
            Head=True
        if o=='-l' or o=='-L':
            if a.isdigit(): #判断输入的是否是数字,如果是的话,就可以赋值给
                Linecount=abs(int(a))
    #下面开始对文件进行切割
    try:
        inputf=open(srcFilename,'r')
        File_i=0
        lines=0
        if Head:
            HeadStr=inputf.readline()
        outputf=open(os.path.dirname(srcFilename)+ os.sep + /
        os.path.splitext(os.path.basename(srcFilename))[0] + '_' + str(File_i)+ /
                        os.path.splitext(os.path.basename(srcFilename))[1],'w')
      
        #进行写文件处理
        for eachline in inputf:
            outputf.write(eachline)
            lines+=1
            if lines==Linecount:#此处是行数到达默认的每文件的行数时
                #到达行数以后,关闭上个文件
                #文件计数I增加1,行数从0开始查
                #打开一个新的文件以便插入
                print u'分割子文件%s完毕;' % outputf.name
                outputf.close()
                File_i+=1
                lines=0
                outputf=open(os.path.dirname(srcFilename)+ os.sep + /
                os.path.splitext(os.path.basename(srcFilename))[0] + '_' + str(File_i)+ /
                                os.path.splitext(os.path.basename(srcFilename))[1],'w')
                if Head:#新文件需要增加行首时
                    outputf.write(HeadStr)
        if not outputf.closed:
            print u'分割子文件%s完毕;' % outputf.name
            outputf.close()
    except:
        print u'发生了未知的错误!'
        sys.exit(0)
    finally:
        inputf.close()
    print u'分割成功,共分割成为%d个文件' %(File_i+1)
    sys.exit(1)
if __name__=='__main__':
    main()

#源程序结束

上面的源程序,功能上基本都做了注释。不过还有几个知识点需要说明一下,也让我加强记忆

1:文件开始用 # -*-  coding:utf-8 -*-  可以在源程序中使用中文

2:print  u'打印的内容'  这样在运行的时候,打印的信息就不是乱码

3:用getopt.getopt()来分析命令行参数,这个模块的用法和解释如下getopt是用来分析命令行参数的模块。
模块中的函数
getopt(args, options[, long_options])

args一般为sys.argv[1:]。

options为选项字母(以"-"开始)组成的字符串,如果某个选项字母带有参数,那么这个字母有要加":"号。

long_options为可选参数,它是一个字符串的List,用来表示长参数(以"--"开始),如果某个长参数带有参数,那么这个字母后面要加"="。

函数有两个返回:
第一个是(option, value)的list。option为带"-"的选项字母,或者是带"--"的长参数(无需严格匹配,例如--hl可匹配--help)。如果option带有参数,那么会在value中给出,否则value为空。
第二个是函数未匹配到的参数。

Python文档中的例子:
import getopt, sys
def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError:
        # print help information and exit:
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-o", "--output"):
            output = a
    # ...
if __name__ == "__main__":
    main()
假如如此调用程序时:python 程序名.py -h -o abc --out def ghi
那么getopt.getopt()函数返回的结果大致是这样的。
(option, value)list中是:
[('-h', ''), ('-o', 'abc'), ('--output', 'def')]
args中是:
['ghi']
-------------------------------------------------------------------------------------------------------------------------------------
另外听说py2exe可以封装成脱离PYTHON运行,就实验了一下,过程分享给大家
第一步:写一个sf_setup.py的安装文件,文件内容如下
#开始

from distutils.core import setup
import py2exe

setup(console=["splitFile.py"])

#结束
第二步:运行这个sf_setup.py py2exe,在同目录下就生成了一个dist目录,这个目录下就是你要发布到没有安装
           python的机器上的发布包。
哈哈,简单吧,py2exe里面有很多方法,我也没仔细研究,有时间大家一起学习啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值