从CSV中采样随机行

时间:2011-03-22 14:28:36

标签: unit-testing csv

我正在使用大型CSV。如何随机抽取一行 - 比方说,总共200行 - 并将它们重新组合成一个与原始结构相同的CSV?

3 个答案:

答案 0 :(得分:1)

我将使用的程序如下:

  1. 在0和CSV文件中的行数之间生成200个唯一数字。
  2. 阅读CSV文件的每一行,并跟踪您正在阅读的行号。如果其行号与上述数字之一匹配,则输出它。

答案 1 :(得分:1)

使用Resevoir Sampling随机抽样技术,该技术不要求所有记录都在内存中,或者知道实际的记录数。有了它,您可以逐个输入您的记录,然后概率地将它们选择到样本中。流耗尽后,输出最终的样本记录。该技术保证流中的每个记录具有与最终样本相同的概率。也就是说,它会生成一个简单的随机样本。

答案 2 :(得分:0)

您可以使用随机模块的random.sample方法随机化线偏移列表,如下所示。

import random

# Fetching line offsets.
# Courtesy: Adam Rosenfield's tip about how to read a HUGE text file.
# http://stackoverflow.com/questions/620367/

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Part where you pick the random lines and copy to your new file
# My 2 cents.
randoffsets = random.sample(line_offset, 200)

with open('your_file') as f:
        for k in randoffsets:
    f.seek(k)
    f.readline() # and append to your new file

你可以尝试使用linecache,如果它适合你,但由于linecache将整个文件读入内存我不知道它对6GB文件的效果如何。

相关问题