如何用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
相关产品推荐
相关产品推荐

