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

[经验分享] Python 大文件分割

[复制链接]

尚未签到

发表于 2017-4-27 11:54:13 | 显示全部楼层 |阅读模式
http://www.okpython.com/bbs/thread-2246-1-7.html

我们知道,一个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: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:printu'打印的内容'这样在运行的时候,打印的信息就不是乱码了

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里面有很多方法,我也没仔细研究,有时间大家一起学习啊

运维网声明 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-369974-1-1.html 上篇帖子: Python 列表 list 数组 array 下篇帖子: 八Python正则表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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