• 帮助
    • 博客
    • 相册
    • 网盘
    • 超市
    • Xer吧
  • 登录
  • 注册
【公告】X5dj广告过滤系统上线    【公告】个人空间首页新增“我的专辑”版块    【公告】新功能“我的专辑”上线,珍藏属于你的美好回忆    【公告】X5dj网站网络硬盘用户使用协议    【公告】X5dj新功能汇总贴:新增“密码目录”功能上线    【公告】X5dj.com相册/网盘上传工具发布    
  • Saromman无欲则安
  • http://www.x5dj.com/saromman 复制地址
  • 首页

  • 博客

  • 相册

  • 网盘

  • 人际关系网

  • 我的专辑

loading...
AVG Anti-Spyware 升级代理 < 上一篇 下一篇 > 让WINDOWS 自动登陆
Python 大文件分割
saromman 发表于: 2008-11-12 14:33 来源:原创  X度:0  浏览:(133)  评论:(0)
收藏 | 复制地址 | [举报此文章] |  大 中 小 |  引用 删除 修改

本文绝对原创,如想转载,请注明

我们知道,一个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:],'l:L: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里面有很多方法,我也没仔细研究,有时间大家一起学习啊
 
系统分类:软件·电脑
标签:python   大文件分割   
推送: 无分类 归类:Python

一事无成,迷惘的生活,生活不迷茫还能怎么清醒?
 
AVG Anti-Spyware 升级代理 < 上一篇 下一篇 > 让WINDOWS 自动登陆
用户回复
首页 上一页 1 下一页 尾页 共 1 页
评分与快速回复

博主推荐
相关文章
  • ·重读PYTHON核心编程(第2版)-第13天
  • ·重读PYTHON核心编程(第2版)----第11天
  • ·重读PYTHON核心编程(第2版)----第10天
  • ·重读PYTHON核心编程(第2版)----第9天
  • ·python处理中文
  • ·搭建python的开发平台
  • ·重读PYTHON核心编程(第2版)-第14天
  • ·python 监控数据库进程
  • ·用python访问sqlite
  • ·Python内置转换函数总结一栏表
  • ·Python学习笔记一——python编译器及IDE的安装
  • ·重读PYTHON核心编程(第2版)-------第1天
  • ·python修改文件内容
  • ·Python 大文件分割
  • ·Python 大文件分割
  • ·Python 网络编程学习初步
  • ·python 函数参数的传递
博友热推
  • 一窝蜂现象绝不仅局限于文化产业
  • 我可以选择放弃,但绝不放弃选择
  • 失去了吃醋的位置,所以我要离开
  • 不堪人生背后是恋人们对她的绝情
  • 拼命于执着,别人又怎能救脱你呢
  • 一起走过青春,却最终走不进婚姻
  • 2009年,一个老百姓眼里的不折腾
  • 我不需要在你眼睛里寻找我的存在
  • KFC这么有名我竟不知是卖什么的
  • 到底是男人坏些,还是女人坏些?
关于我们 | X5dj动态 | 加入我们 | 友情链接 | 官方日志 | 免责声明 | 举报不良信息
北京开创明天科技有限公司 版权所有 京ICP证040979号