python读取100g文件_python生成大文件 100G瞬间生成 三种方法

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表示从文件尾开始。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值