我想用python把一个文件随机分成两半。我有一个小脚本,但它并没有精确地分成两部分。有什么建议吗?
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()发布于 2018-03-11 03:00:57
随机性的概念意味着你不能确定地依赖于数字来产生低于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)发布于 2018-03-11 03:01:54
随机不会给你每一次恰好一半。如果你抛硬币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 (定义为顶部的常量),但不会拆分到每个文件超过一行。以这种方式处理将允许您将其放入一个函数中,该函数可以将可变数量的文件拆分成多个文件,而不必针对每种情况修改代码。
https://stackoverflow.com/questions/49212869
复制相似问题