python如何生成指定文件大小

 更新时间:2025年06月04日 14:06:24   作者:lewis_0  
这篇文章主要介绍了python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python生成指定文件大小

方法一(速度最快)

def create_file_fast(file_path, size_mb):
    """快速生成指定大小的空文件(全0填充)"""
    size_bytes = size_mb * 1024 * 1024
    with open(file_path, 'wb') as f:
        f.seek(size_bytes - 1)  # 定位到文件末尾前一字节
        f.write(b'\0')          # 写入单个空字节

# 示例:生成500MB文件
if __name__ == '__main__:
	create_file_fast('100mb_file.bin', 500)

方法二(中等速度)

import os
import random

def create_random_file(file_path, size_mb):
    """生成包含随机内容的文件"""
    size_bytes = size_mb * 1024 * 1024
    chunk_size = 1024 * 1024  # 每次写入1MB
    
    with open(file_path, 'wb') as f:
        while size_bytes > 0:
            chunk = min(chunk_size, size_bytes)
            # 生成随机字节数据(比os.urandom更快)
            data = bytes(random.getrandbits(8) for _ in range(chunk))
            f.write(data)
            size_bytes -= chunk

# 示例:生成500MB文件
if __name__ == '__main__:
	create_random_file('random_500mb.bin', 500)

方法三(生成可读文本文件–较慢)

import string
import random

def create_text_file(file_path, size_mb, line_length=80):
    """生成包含随机文本的文件(带换行符)"""
    size_bytes = size_mb * 1024 * 1024
    chars = string.ascii_letters + string.digits + string.punctuation + ' '
    
    with open(file_path, 'w') as f:
        while size_bytes > 0:
            # 生成一行文本
            line = ''.join(random.choices(chars, k=line_length))
            line += '\n'  # 添加换行符
            
            f.write(line)
            size_bytes -= len(line.encode('utf-8'))  # 计算UTF-8编码后的字节大小

# 示例:生成500MB文本文件
if __name__ == '__main__:
	create_text_file('10mb_text.txt', 500)

方法四(使用内存映射高效生成–超大文件)

import mmap
import os

def create_large_file(file_path, size_gb):
    """高效生成超大文件(GB级别)"""
    size_bytes = size_gb * 1024 ** 3
    
    # 创建空文件并设置大小
    with open(file_path, 'wb') as f:
        f.truncate(size_bytes)
    
    # 使用内存映射填充随机数据
    with open(file_path, 'r+b') as f:
        mm = mmap.mmap(f.fileno(), 0)
        chunk_size = 1024 * 1024 * 100  # 每次处理100MB
        for offset in range(0, size_bytes, chunk_size):
            end = min(offset + chunk_size, size_bytes)
            mm[offset:end] = os.urandom(end - offset)
        mm.close()

# 示例:生成5GB文件
if __name__ == '__main__:
	create_large_file('5gb_file.dat', 5)

方法五(生成特定模式文件)

def create_pattern_file(file_path, size_mb, pattern=b'ABCD'):
    """生成重复模式的文件(用于测试)"""
    size_bytes = size_mb * 1024 * 1024
    pattern_len = len(pattern)
    
    with open(file_path, 'wb') as f:
        # 计算完整模式块数量
        full_blocks = size_bytes // pattern_len
        # 剩余字节
        remainder = size_bytes % pattern_len
        
        # 写入完整块
        for _ in range(full_blocks):
            f.write(pattern)
        
        # 写入剩余部分
        if remainder:
            f.write(pattern[:remainder])

# 示例:生成500MB的重复模式文件
if __name__ == '__main__:
	create_pattern_file('pattern_50mb.dat', 500, b'TESTPATTERN')

方法六

def run(file_size):
    #输入的文件大小去除首尾空格后切割,如果列表中只有一个数字说明是整数,否则就是小数
    file_path = "D:/dir/"
    file_size = file_size
    print('file_size', file_size)
    new_file_size = file_size.strip()
    file_size_list = new_file_size.split(".")
    start = time.time()
    if len(file_size_list) == 1:
        int_size_mb(file_size)
        print("文件大小{}MB,已存入地址{}".format(file_size, file_path))
    else:
        int_size_mb(file_size)
        float_size_mb(file_size)
        print("文件大小{}MB,已存入地址{}".format(file_size,file_path))
    end = time.time()
    timer = end - start
    speed = float(file_size) / timer
    # print(start, end, timer, speed)
    logger.info('写入文件共耗时:' + str(timer) + ',写入速度为:' + str(speed))
def int_size_mb(file_size):
    file_path = "D:/dir/"
    file_name = 'test_file'
    new_file_size = file_size.strip()
    file_size_list = new_file_size.split(".")
    #整数部分用写入文件w方式
    with open(file_path+file_name,"w") as file:
        #b-kb-mb文件大小转化
        for i in range(int(file_size_list[0])):
            for j in range(1024):
                file.write("01"*512)
def float_size_mb(file_size):
    file_path = "D:/dir/"
    file_name = 'test_file'
    new_file_size = file_size.strip()
    file_size_list = new_file_size.split(".")
    #小数部分用追加写入a方法
    file_size = file_size
    with open(file_path+file_name,"a") as file:
        #获取小数(单位mb)
        float_size_mb=float(file_size)-int(file_size_list[0])
        for i in range(1024):
            file.write("1"*int(1024*float_size_mb))

# 示例:生成500MB的文件           
if __name__ == '__main__':
	run(500)
	

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • django 将model转换为字典的方法示例

    django 将model转换为字典的方法示例

    平常的开发过程中不免遇到需要把model转成字典的需求,这篇文章主要介绍了Django model转字典的方法,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • python 常见的排序算法实现汇总

    python 常见的排序算法实现汇总

    这篇文章主要介绍了python 常见的排序算法,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • python实现apahce网站日志分析示例

    python实现apahce网站日志分析示例

    这篇文章主要介绍了python实现apahce网站日志分析示例,需要的朋友可以参考下
    2014-04-04
  • pyqt环境搭建教程

    pyqt环境搭建教程

    pyqt是一个用于创建GUI应用程序的跨平台工具包,它将python与qt库融为一体,本文给大家分享pyqt环境搭建教程,感兴趣的朋友一起看看吧
    2023-11-11
  • python实现大文本文件分割

    python实现大文本文件分割

    这篇文章主要为大家详细介绍了python实现大文本文件分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 如何利用python实现把视频转换成gif图形

    如何利用python实现把视频转换成gif图形

    将视频转换为 GIF 图形的重要性不言而喻,在信息快速传播和多种社交平台广泛应用的背景下,GIF 动画不仅为个人用户提供了一种轻松的表达方式,本文给大家介绍了如何利用python实现把视频转换成gif图形,需要的朋友可以参考下
    2024-10-10
  • python中p-value的实现方式

    python中p-value的实现方式

    今天小编就为大家分享一篇python中p-value的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • pandas的to_datetime时间转换使用及学习心得

    pandas的to_datetime时间转换使用及学习心得

    这篇文章主要给大家介绍了关于pandas的to_datetime时间转换使用及学习心得的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用pandas具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • windows10下安装TensorFlow Object Detection API的步骤

    windows10下安装TensorFlow Object Detection API的步骤

    这篇文章主要介绍了windows10下安装TensorFlow Object Detection API的步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 详解如何从TensorFlow的mnist数据集导出手写体数字图片

    详解如何从TensorFlow的mnist数据集导出手写体数字图片

    这篇文章主要介绍了详解如何从TensorFlow的mnist数据集导出手写体数字图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论