python生成大文件 100G瞬间生成 三种方法

来源:互联网 发布:cname解析 域名后加点 编辑:程序博客网 时间:2024/06/10 00:52

11111111111111111

前面写过一个生成多个文件的脚本,可以说只要学过几天python的人都能写出来。在测试时经常也会遇到需要的测试数据为一个4.9G的大文件或是更大的10G的文件。。这样如果用手工生成那就悲剧了,,也有人有脚本生成大部分人会感觉效率不高,需要很长时间。。我也遇到了这样的高题,,经常调优和对高手的请教,写出了自己认为最快的方法。。秒级的生成。。下面将调优的三次脚本贴出来大家共同学习,由于比较长所以分三次发部。。

  1.第一个的脚本,生成一个几十兆文件都需要好几分钟。更别说几G或好几十几的文件了。。
#coding=utf-8
'''
Created on 2012-5-29


@author: lianghui
'''
import os
import time


#获取文件的属性值
def getfile_att(filepath,*att_type):
    file_stat=os.stat(filepath)
    file_st={}
    if 'fctime' in att_type:
        file_st['fctime']=str(int(file_stat.st_ctime))
    if 'fmtime' in att_type:
        file_st['fmtime']=str(int(file_stat.st_mtime))
    if 'fatime' in att_type:
        file_st['fatime']=str(int(file_stat.st_atime))
    if 'fmode' in att_type:
        file_st['fmode']=str(file_stat.st_mode)
    if 'fsize' in att_type:
        file_st['fsize']=str(int(file_stat.st_size))
    return file_st


def file_size(size):
    local_time = time.strftime("%Y%m%d%H%M%S",time.localtime())
    file_name = "E:\\testFile\\"+str(local_time)+".txt"
    f = open(file_name,'ab')
    note = "测试文件内容"
    for i in range(1,99999999):
        f.write(note+str(i))
        filesize = float(getfile_att(file_name,'fsize')["fsize"])
        if filesize/1024/1024/1024 >= size:
            break
        else:
            continue    
    f.close()
    print "ALL down!"


if __name__ == '__main__':
    size = input("input you's size:")
    file_size(size)
print file_size

上段代码用了循环和判断且每次循环都得取一个文件的属性,所以耗时比较严重。


2222222222222222

发现脚本1的问题后,去掉对文件属性的操作改为直接对写内容的长度累加而且去掉了循环而改用判断。这样效率提高了很多。在linux下会是比较快的(本人没试),在windows下生成一个5G的文件大概只需要25m钟。


#coding = utf-8
#!/usr/bin/env python


import os
import time


def create_file_size(size):
    size *= 1024 * 1024*1024
    print size 
    local_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
    file_name = "E:\\testFile\\"+str(local_time) + ".txt"
    with open(file_name, 'w') as f:
        note = 'Test File Contents: '
        i = 0
        fsize = 0
        while True:
            i += 1
            text = note + str(i) + "\n"
            f.write(text)
            fsize += len(text)
            if fsize >= size:
                break
    print "ALL down!"


if __name__ == '__main__':
    size = input("input you's size:")
    create_file_size(size)
些脚本在生成一个5G的文件需要20分钟,想想每次生成一个文件也需要25分,有没有更快的方法呢?有人会说把text内容写多一些。可以改进一些但优化不了很多,而且当文档内容过长时,生成的文件大小会不精确。


3333333333333333

以下的这段脚本又简洁又快速,生成一个100G的文件也只需要1s...只不过此方法会不容易想到。。


def creatfilesize(n):
    local_time = time.strftime("%Y%m%d%H%M%S",time.localtime())
    file_name = "E:\\testFile\\"+str(local_time)+".txt"
    bigFile= open(file_name, 'w')
    bigFile.seek(1024*1024*1024*n) 
    bigFile.write('test')
    #bigFile.write("test")
    bigFile.close()
    print "ALL down !"


if __name__ == '__main__':
    n = input("输入你要生成的文件大小(单位为G):")
    creatfilesize(n)


此脚本的核心只是一个seek,一个seek搞定了一下问题,汗,只能说python太强大了。
seek函数的用法:
seek(offset[,whence]) 参数offset是指从哪个位置开始(偏移多少)。whence是指从哪个位置开始偏移。默认为0,即文档的开头。1表示相对位置(当前位置)。2表示从文件尾开始。


原创粉丝点击