天使漫步IT工作室天使漫步IT工作室

python切割大数据文件(文本)成多个小文件


Warning: count(): Parameter must be an array or an object that implements Countable in /www/wwwroot/u11u.com/usr/themes/wq/functions.php on line 110

Warning: count(): Parameter must be an array or an object that implements Countable in /www/wwwroot/u11u.com/usr/themes/wq/functions.php on line 116

一、代码

重复造轮子的事情在下是不干的,不过朋友做光学试验要求将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类支持程序可以跳转到文件的任意地方来读写数据,即随机访问模式。不用重新打开文件就可以定位磁头到任何一处。

本站原创,欢迎转载,转载敬请标明出处:天使漫步IT工作室 » python切割大数据文件(文本)成多个小文件
添加新评论


Warning: Use of undefined constant php - assumed 'php' (this will throw an Error in a future version of PHP) in /www/wwwroot/u11u.com/usr/themes/wq/comments.php on line 38