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