一、代码
重复造轮子的事情在下是不干的,不过朋友做光学试验要求将12G的文件切割为小文件。
这有点考验人啊,不过在万能的搜索引擎帮助下成功解决了问题。
代码如下:
# -*- coding: utf-8 -*-
import os
import time
def mkSubFile(lines,srcName,sub):
[des_filename, extname] = os.path.splitext(srcName)
filename = des_filename + '_' + str(sub) + extname
print( 'make file: %s' %filename)
fout = open(filename,'w')
try:
#fout.writelines([head])
fout.writelines(lines)
return sub + 1
finally:
fout.close()
def splitByLineCount(filename,count):
fin = open(filename,'r')
try:
#head = fin.readline()
buf = []
sub = 1
for line in fin:
buf.append(line)
if len(buf) == count:
sub = mkSubFile(buf,filename,sub)
buf = []
if len(buf) != 0:
sub = mkSubFile(buf,filename,sub)
finally:
fin.close()
if __name__ == '__main__':
begin = time.time()
splitByLineCount('D_1kk.dat',10*1000)
end = time.time()
print('time is %d seconds ' % (end - begin))
函数splitByLineCount参数二为每个小文件的行数。点击下载文件:python_split_file.py.zip
二、启示
- 1、在读取文件的时候需要api从磁盘中逐一加载,也就是并不会一下子加载进来,加载多少由自己的程序控制。
- 2、磁盘的磁头是跟着api的读取进度移动的,也就是读到哪里,磁头就在哪里。
- 3、是否有中api可以随机移动磁头的呢?java的RandomAccessFile类支持程序可以跳转到文件的任意地方来读写数据,即随机访问模式。不用重新打开文件就可以定位磁头到任何一处。