首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件分成2个随机文件

文件分成2个随机文件
EN

Stack Overflow用户
提问于 2018-03-11 02:58:17
回答 2查看 48关注 0票数 2

我想用python把一个文件随机分成两半。我有一个小脚本,但它并没有精确地分成两部分。有什么建议吗?

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2018-03-11 03:00:57

随机性的概念意味着你不能确定地依赖于数字来产生低于0.5和高于0.5的等量结果。

您可以使用计数器,并在对列表中的所有行进行混洗后检查它是偶数还是奇数:

代码语言:javascript
复制
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)一起使用:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2018-03-11 03:01:54

随机不会给你每一次恰好一半。如果你抛硬币10次,你不一定会得到5个正面和5个反面。

一种方法是使用Python: Slicing a list into n nearly-equal-length partitions中描述的分区方法,但要事先打乱结果。

代码语言:javascript
复制
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 (定义为顶部的常量),但不会拆分到每个文件超过一行。以这种方式处理将允许您将其放入一个函数中,该函数可以将可变数量的文件拆分成多个文件,而不必针对每种情况修改代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49212869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档