本文目录导读:

#!/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吉字节
注意事项
- 磁盘空间:确保有足够的磁盘空间,程序不会事先检查
- 零填充 vs 随机数据:零填充速度更快,随机数据更真实但可能产生大文件时较慢
- 大文件性能:生成数GB文件时建议使用零填充
- 操作系统限制:某些文件系统可能有单文件大小限制
这个脚本可以用于测试存储系统、网络传输、备份方案等场景。