You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将文件随机均分为两份?现有脚本无法均分求建议

解决Python随机精准二等分文件的问题

我来帮你搞定这个精准随机分割文件的需求!之前的脚本没法做到精准二等分,大概率是没控制好最终的行数比例,或者没处理总行数为奇数的情况。下面给你一套可行的解决方案,分两种场景:小文件(可以一次性读入内存)和大文件(内存友好型)。

方案一:小文件快速处理(一次性读入)

这种方法适合文件不大的情况,操作简单且容易控制比例:

import random

def split_file_randomly(input_path, output_path1, output_path2):
    # 读取所有行,保留原始换行格式
    with open(input_path, 'r', encoding='utf-8') as f:
        all_lines = f.readlines()
    
    total = len(all_lines)
    # 计算分割点:奇数行时第一个文件多1行,保证尽可能均等
    split_count = (total + 1) // 2
    
    # 生成所有行的索引并随机打乱
    line_indices = list(range(total))
    random.shuffle(line_indices)
    
    # 分割索引组
    group1_indices = line_indices[:split_count]
    group2_indices = line_indices[split_count:]
    
    # 【可选】如果需要保留原文件的行顺序,就对索引排序;不需要则跳过这步
    group1_indices.sort()
    group2_indices.sort()
    
    # 写入第一个文件
    with open(output_path1, 'w', encoding='utf-8') as f1:
        for idx in group1_indices:
            f1.write(all_lines[idx])
    
    # 写入第二个文件
    with open(output_path2, 'w', encoding='utf-8') as f2:
        for idx in group2_indices:
            f2.write(all_lines[idx])

# 调用示例
split_file_randomly("your_input_file.txt", "output_part1.txt", "output_part2.txt")

关键细节说明:

  • 用readlines()读取所有行,确保每行的换行符被保留,避免输出文件格式错乱。
  • split_count = (total +1) //2:完美处理奇数行的情况,比如总共有5行时,第一个文件3行,第二个2行,是最接近均等的分割方式;如果要求严格对半(仅偶数行场景),改成split_count = total //2即可。
  • 随机打乱索引而非直接打乱行,既能实现随机选取,又能通过排序索引保留原文件的行顺序(可选)。

方案二:大文件内存友好处理

如果你的文件特别大(比如几GB),没法一次性读入内存,可以用概率抽样+计数控制的方法,保证最终分割比例精准:

import random

def split_large_file(input_path, output_path1, output_path2):
    # 第一步:先统计总行数
    total_lines = 0
    with open(input_path, 'r', encoding='utf-8') as f:
        for _ in f:
            total_lines +=1
    
    split_count = (total_lines +1) //2
    written_to_part1 = 0
    
    # 第二步:遍历文件,按概率分配行,同时控制数量
    with open(input_path, 'r', encoding='utf-8') as f, \
         open(output_path1, 'w', encoding='utf-8') as f1, \
         open(output_path2, 'w', encoding='utf-8') as f2:
        
        current_line_num = 0
        for line in f:
            remaining_needed = split_count - written_to_part1
            remaining_total = total_lines - current_line_num
            
            # 用动态概率保证最终正好选够split_count行
            if remaining_needed >0 and random.random() < remaining_needed / remaining_total:
                f1.write(line)
                written_to_part1 +=1
            else:
                f2.write(line)
            
            current_line_num +=1

原理说明:

这个方法用了蓄水池抽样的变种逻辑,每一行都根据「还需要多少行到第一个文件」和「剩余总行数」来计算被选中的概率,确保最终第一个文件正好有split_count行,完全精准控制比例,同时不需要把整个文件读入内存。

常见问题排查

如果之前的脚本失效,大概率是这两个原因:

  • 没有提前统计总行数,随机分配时没控制最终数量,导致比例偏差;
  • 处理奇数行时没有做特殊处理,出现分割不均的情况。

按照上面的方案改,就能实现精准的随机二等分啦!

内容的提问来源于stack exchange,提问作者November

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:51:07