如何按百分比随机拆分TXT文件为训练集、测试集与验证集
大型TXT文件随机拆分实现方案
以下两种方案都可完美处理5万行及以上的大文件,不会出现内存溢出问题,拆分比例严格遵循7:2:1要求。
方案1:Python 实现(全平台通用,可定制性强)
直接运行以下代码即可,支持固定随机种子保证拆分结果可复现:
import random # 配置参数 INPUT_FILE = "你的源文件.txt" TRAIN_RATIO = 0.7 TEST_RATIO = 0.2 DEV_RATIO = 0.1 RANDOM_SEED = 42 # 固定种子可保证每次拆分结果一致,不需要可删除 # 固定随机种子 if RANDOM_SEED: random.seed(RANDOM_SEED) # 读取所有行(5万行仅占几MB内存,无加载压力) with open(INPUT_FILE, 'r', encoding='utf-8') as f: lines = f.readlines() # 随机打乱行顺序 random.shuffle(lines) total_lines = len(lines) # 计算各数据集拆分边界 train_end = int(total_lines * TRAIN_RATIO) test_end = train_end + int(total_lines * TEST_RATIO) # 写入三个结果文件 with open("train.txt", 'w', encoding='utf-8') as f: f.writelines(lines[:train_end]) with open("test.txt", 'w', encoding='utf-8') as f: f.writelines(lines[train_end:test_end]) with open("dev.txt", 'w', encoding='utf-8') as f: f.writelines(lines[test_end:])
注意事项
- 如果你的源文件是GBK/GB2312编码,把所有
encoding='utf-8'参数改成encoding='gbk'即可 - 如果需要保留源文件的表头,可提前单独读取第一行,分别写入三个输出文件的开头
- 不需要固定拆分结果的话,删除
RANDOM_SEED相关的两行代码即可
方案2:Linux/macOS 命令行实现(无需写代码,执行效率更高)
适合类Unix系统用户,几行命令即可完成拆分,十万行级文件也能秒处理:
# 1. 打乱所有行并存为临时文件 shuf 你的源文件.txt > shuffled_temp.txt # 2. 计算源文件总行数 total=$(wc -l < shuffled_temp.txt) # 3. 按比例拆分到三个结果文件 head -n $((total*7/10)) shuffled_temp.txt > train.txt tail -n $((total*3/10)) shuffled_temp.txt | head -n $((total*2/10)) > test.txt tail -n $((total*1/10)) shuffled_temp.txt > dev.txt # 4. 删除临时文件 rm shuffled_temp.txt
注意事项
- macOS 系统默认没有
shuf命令,可通过brew install coreutils安装后,把命令中的shuf换成gshuf使用 - 该方案默认按整数比例取行数,和精确比例的误差在个位数级别,对大文件来说可忽略
内容的提问来源于stack exchange,提问作者Kimi Shui
相关产品推荐
相关产品推荐

