批量生成指定大小文件脚本

wen 实用脚本 2

本文目录导读:

批量生成指定大小文件脚本

  1. 使用方法
  2. 注意事项
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量生成指定大小文件脚本
支持单位:B, KB, MB, GB
"""
import os
import argparse
import random
import string
def create_file(filepath, size_bytes, fill_random=True):
    """创建指定大小的文件"""
    try:
        with open(filepath, 'wb') as f:
            if fill_random:
                # 随机数据填充(更真实)
                chunk_size = 1024 * 1024  # 1MB块写入
                remaining = size_bytes
                while remaining > 0:
                    write_size = min(chunk_size, remaining)
                    # 生成随机数据块
                    random_data = bytes([random.randint(0, 255) for _ in range(write_size)])
                    f.write(random_data)
                    remaining -= write_size
            else:
                # 零填充(速度更快)
                f.write(b'\x00' * size_bytes)
        return True
    except Exception as e:
        print(f"创建文件失败 {filepath}: {e}")
        return False
def parse_size(size_str):
    """将人类可读的大小转为字节数"""
    size_str = size_str.strip().upper()
    units = {'B': 1, 'KB': 1024, 'MB': 1024**2, 'GB': 1024**3}
    # 解析数字和单位
    for unit in ['GB', 'MB', 'KB', 'B']:
        if size_str.endswith(unit):
            try:
                number = float(size_str[:-len(unit)])
                return int(number * units[unit])
            except ValueError:
                raise ValueError(f"无法解析大小: {size_str}")
    # 纯数字默认视为字节
    try:
        return int(size_str)
    except ValueError:
        raise ValueError(f"无法解析大小: {size_str}")
def generate_filenames(prefix="test", count=10, extension=".dat", use_counter=True):
    """生成文件名列表"""
    filenames = []
    for i in range(1, count + 1):
        if use_counter:
            filename = f"{prefix}_{i:03d}{extension}"
        else:
            filename = f"{prefix}_{random_string(8)}{extension}"
        filenames.append(filename)
    return filenames
def random_string(length=8):
    """生成随机字符串"""
    return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length))
def main():
    parser = argparse.ArgumentParser(description="批量生成指定大小文件")
    parser.add_argument("-s", "--size", required=True, 
                       help="文件大小, 1MB, 500KB, 100B, 2GB")
    parser.add_argument("-n", "--count", type=int, default=10,
                       help="生成文件数量 (默认: 10)")
    parser.add_argument("-p", "--prefix", default="test",
                       help="文件名前缀 (默认: test)")
    parser.add_argument("-e", "--ext", default=".dat",
                       help="文件扩展名 (默认: .dat)")
    parser.add_argument("-o", "--output", default="./generated_files",
                       help="输出目录 (默认: ./generated_files)")
    parser.add_argument("-r", "--random", action="store_true",
                       help="使用随机数据填充 (默认使用零填充)")
    parser.add_argument("-q", "--quiet", action="store_true",
                       help="安静模式,不显示进度")
    args = parser.parse_args()
    # 解析目标大小
    try:
        target_size = parse_size(args.size)
    except ValueError as e:
        print(f"错误: {e}")
        return 1
    # 创建输出目录
    output_dir = args.output
    os.makedirs(output_dir, exist_ok=True)
    # 生成文件名
    filenames = generate_filenames(args.prefix, args.count, args.ext)
    # 计算总数据量
    total_size = target_size * args.count
    if not args.quiet:
        print(f"目标: 生成 {args.count} 个文件,每个 {args.size} ({target_size} 字节)")
        print(f"总数据量: {total_size} 字节 ({total_size / 1024**3:.2f} GB)")
        print(f"输出目录: {os.path.abspath(output_dir)}")
        print(f"填充方式: {'随机数据' if args.random else '零填充'}")
        print("-" * 50)
    # 批量创建文件
    success_count = 0
    for i, filename in enumerate(filenames, 1):
        filepath = os.path.join(output_dir, filename)
        success = create_file(filepath, target_size, args.random)
        if success:
            success_count += 1
            if not args.quiet:
                size_str = f"{target_size / 1024**2:.2f} MB" if target_size > 1024*1024 else f"{target_size / 1024:.2f} KB"
                print(f"  [{i:3d}/{args.count}] 已创建: {filename} ({size_str})")
    # 输出结果
    print("-" * 50)
    print(f"完成: 成功创建 {success_count} 个文件")
    print(f"目录: {os.path.abspath(output_dir)}")
    return 0 if success_count == args.count else 1
if __name__ == "__main__":
    exit(main())

使用方法

保存脚本

将上述代码保存为 gen_files.py

运行脚本

基本用法 - 生成10个1MB文件:

python gen_files.py --size 1MB

生成100个500KB文件

python gen_files.py --size 500KB --count 100

自定义前缀和扩展名

python gen_files.py -s 2MB -n 5 -p mydata -e .bin

使用随机数据填充(更真实)

python gen_files.py -s 10MB -n 3 -r

指定输出目录

python gen_files.py -s 1GB -n 1 -o ./big_files

参数说明

参数 简写 说明 默认值
--size -s 文件大小(必需),支持 B/KB/MB/GB
--count -n 生成文件数量 10
--prefix -p 文件名前缀 test
--ext -e 文件扩展名 .dat
--output -o 输出目录 ./generated_files
--random -r 使用随机数据填充 否(零填充)
--quiet -q 安静模式

大小示例

  • 100B → 100字节
  • 1KB → 1024字节
  • 5MB → 2.5兆字节
  • 5GB → 0.5吉字节

注意事项

  1. 磁盘空间:确保有足够的磁盘空间,程序不会事先检查
  2. 零填充 vs 随机数据:零填充速度更快,随机数据更真实但可能产生大文件时较慢
  3. 大文件性能:生成数GB文件时建议使用零填充
  4. 操作系统限制:某些文件系统可能有单文件大小限制

这个脚本可以用于测试存储系统、网络传输、备份方案等场景。

抱歉,评论功能暂时关闭!