Python - 从一个非常大的文件中读取随机行并附加到另一个文件

时间:2016-10-20 03:21:01

标签: python

我们试图从一个非常大的文件中获取大约1M的随机行,其中可能有大约3M的记录。需要将选定的随机行写入第三个文件。 你对我们有什么建议吗?

3 个答案:

答案 0 :(得分:4)

供将来参考,因为其他答案已经提供了适用于内存的工作负载的解决方案:

import random

def reservoir_sampling(l, k):
    it = iter(l)
    try:
        result = [next(it) for _ in range(k)] # use xrange if on python 2.x
    except StopIteration:
        raise ValueError("Sample larger than population")

    for i, item in enumerate(it, start=k):
        s = random.randint(0, i)
        if s < k:
            result[s] = item

    random.shuffle(result)
    return result

with open('input.txt') as infile, open('output.txt', 'a') as outfile:
    for line in reservoir_sampling(infile, 1000000):
        outfile.write(line)

该算法称为储层采样,需要O(n)时间和O(k)内存,具体取决于您的需求,您可能需要或可能不需要random.shuffle调用。

答案 1 :(得分:3)

例如,100万个字符行的300万条记录并不大 - 这完全取决于您使用的硬件。你可以这么做:

import random

with open('input.txt') as infile, open('output.txt', 'a') as outfile:
    outfile.writelines(random.sample(infile.readlines(), 1000000))

这是更快速的方法之一,也很简单。所以,那就是看看它是否适合你的问题。

答案 2 :(得分:2)

您可以使用readlines()并将文件转储到列表中。然后你可以简单地生成100万个随机数。当然,它们必须在文件列表/行数的范围内,并且每次生成随机数时,访问列表中该位置的行并将其写入要移动它的文件in。