免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10235 | 回复: 36
打印 上一主题 下一主题

求助,python 生成大文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-14 09:41 |只看该作者 |倒序浏览
最近在学习python,写了一个生成文件的脚本但在生成大文件时发现效率比较低,生成一个5G文件时等待时间会比较长。
以下是自己写的生成文件脚本,希望高手能优化或是给出其它的好的办法。。。有问题的地方也请高手指出。。。

#coding=utf-8
'''
Created on 2012-5-29

@author: xiaochou
'''

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 >= size:
            break
        else:
            continue   
    f.close()
    print "ALL down!"

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

论坛徽章:
0
2 [报告]
发表于 2012-06-14 09:50 |只看该作者
这只是为了好玩吗?可以写入任意内容还是特定的数据?

你在循环里反复做这个操作:
filesize = float(getfile_att(file_name,'fsize')["fsize"])
我觉得还不如设置个变量来计算总共写入了多少

这有别人的方法,我没有测试过:
http://stackoverflow.com/questio ... python-in-windows-7

论坛徽章:
0
3 [报告]
发表于 2012-06-14 09:57 |只看该作者
不是为了玩,我是做测试的,经常会有一些测试数据的需要,比如我们需要一个4.9G的文件。不可能用手工去生成。只能用脚本去生成。。。

论坛徽章:
0
4 [报告]
发表于 2012-06-14 10:02 |只看该作者
内容可以随便写的,只要是可以生成大文件,且效率比较高就可以。。回复 2# anonymous0502


   

论坛徽章:
0
5 [报告]
发表于 2012-06-14 10:02 |只看该作者
哦,其他部分没怎么看,只是大概看了下时间应该都是花在循环里吧
干脆在循环之前就计算出要生成这个大小的文件需要循环多少次,然后就直接循环这么多次然后结束,这样不是就省去了N多的无意义的判断语句的执行。

论坛徽章:
0
6 [报告]
发表于 2012-06-14 10:03 |只看该作者
每次写入的数据量大一些,估计也会快不少吧。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
7 [报告]
发表于 2012-06-14 10:25 |只看该作者
  1. #!/usr/bin/env python

  2. import os
  3. import time

  4. def create_file_size(size):
  5.     size *= 1024 * 1024
  6.     print size
  7.     local_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
  8.     file_name = str(local_time) + ".txt"
  9.     with open(file_name, 'w') as f:
  10.         note = 'Test File Contents: '
  11.         i = 0
  12.         fsize = 0
  13.         while True:
  14.             i += 1
  15.             text = note + str(i) + "\n"
  16.             f.write(text)
  17.             fsize += len(text)
  18.             if fsize >= size:
  19.                 break
  20.     print "ALL down!"

  21. if __name__ == '__main__':
  22.     size = input("input you's size:")
  23.     create_file_size(size)
复制代码
大概生成 5G 文件,在 ubuntu 下需要 1-2 秒吧

论坛徽章:
0
8 [报告]
发表于 2012-06-14 12:36 |只看该作者
本帖最后由 lian860911 于 2012-06-14 12:40 编辑

  1. bigFile= open(_filename_, 'w')
  2. bigFile.seek(1024*1024*1024* fileSize-1) #大小自己定,需要几个G, fileSize就是几,速度绝对快
  3. bigFile.write('\x00')
  4. bigFile.close()
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-06-14 13:56 |只看该作者
省去了对文件属性的不断读取和循环确实比我之前的快了很多。。。。在linux下会很快。。但在windows下也是25分左右,,是不是特别的快。。但学到了很多。。谢谢了回复 7# cdtits


   

论坛徽章:
0
10 [报告]
发表于 2012-06-14 14:01 |只看该作者
太快了。。。一个10G的文件在windows下只需要1s,瞬间完成。。。太感谢了。。。但不是很了解正在学习中。。回复 8# lian860911


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP