【问题标题】:File division into 2 random files文件分成2个随机文件
【发布时间】:2018-03-10 18:58:17
【问题描述】:

我想用 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()

【问题讨论】:

  • 将所有行读入一个列表;洗牌;然后将列表的一半写入每个文件。
  • 除非随机的两半需要保持顺序,这需要在洗牌后做一些额外的工作

标签: python divide


【解决方案1】:

随机性的概念意味着您将无法确定性地依赖该数字来产生等量的低于 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)

【讨论】:

  • 那根本不是随机的......问题是随机获取文件的一半并将其发送到一个位置,然后将另一半发送到另一个位置。
  • 它正在工作,谢谢。但是如果我需要更改并拆分为 2 而不是 10 个随机文件?
  • @November - 查看更新的答案 - 您可以根据需要增加模数检查,每次添加到不同的文件
  • 我只得到包含 f1、f2 和 f10 数据的文件
  • 在我有#... etc的代码中,您需要继续检查counter % 10结果的模式
【解决方案2】:

random 不会每次都给你一半。如果你掷硬币 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(定义为顶部的常量),但每个文件的拆分不会超过一行。以这种方式处理事情可以让您将其放入一个函数中,该函数可以将可变数量的文件拆分成,而无需为每种情况更改代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 2012-04-30
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多