我想用python将文件分成两个随机的半部分。我有一个小脚本,但它没有完全划分为2.任何建议?
import random
fin = open("test.txt", 'rb')
f1out = open("test1.txt", 'wb')
f2out = open("test2.txt", 'wb')
for line in fin:
r = random.random()
if r < 0.5:
f1out.write(line)
else:
f2out.write(line)
fin.close()
f1out.close()
f2out.close()
答案 0 :(得分:3)
随机性的概念意味着您将无法确定性地依赖该数字来产生低于0.5和高于0.5的等量结果。
您可以使用计数器并在清洗列表中的所有行后检查它是偶数还是奇数:
file_lines = [line for line in fin]
random.shuffle(file_lines)
counter = 0
for line in file_lines:
counter += 1
if counter % 2 == 0:
f1out.write(line)
else:
f2out.write(line)
您可以将此模式与任何数字一起使用(在此示例中为10
):
counter = 0
for line in file_lines:
counter += 1
if counter % 10 == 0:
f1out.write(line)
elif counter % 10 == 1:
f2out.write(line)
elif counter % 10 == 2:
f3out.write(line)
elif counter % 10 == 3:
f4out.write(line)
elif counter % 10 == 4:
f5out.write(line)
elif counter % 10 == 5:
f6out.write(line)
elif counter % 10 == 6:
f7out.write(line)
elif counter % 10 == 7:
f8out.write(line)
elif counter % 10 == 8:
f9out.write(line)
else:
f10out.write(line)
答案 1 :(得分:0)
随机每次都不会给你一半。如果你翻硬币10次,你不一定得到5个头和5个尾巴。
一种方法是使用Python: Slicing a list into n nearly-equal-length partitions中描述的分区方法,但事先将结果混洗。
import random
N_FILES = 2
out = [open("test{}.txt".format(i), 'wb') for i in range(min(N_FILES, n))]
fin = open("test.txt", 'rb')
lines = fin.readlines()
random.shuffle(lines)
n = len(lines)
size = n / float(N_FILES)
partitions = [ lines[int(round(size * i)): int(round(size * (i + 1)))] for i in xrange(n) ]
for f, lines in zip(out, partitions):
for line in lines:
f.write(line)
fin.close()
for f in out:
f.close()
上面的代码将输入文件拆分为大小相等的N_FILES(在顶部定义为常量),但每个文件永远不会超出一行。以这种方式处理事情会让你把它放到一个函数中,这个函数可以分成不同数量的文件,而不必为每种情况改变代码。