2013-08-19 67 views

回答

20

所以这个问题有两个部分。首先获取你的csv的每一行,其次是随机抽样。我会建议用列表理解来构建行列表。沿着线的东西:

with open("your_file.csv", "rb") as source: 
    lines = [line for line in source] 

一旦你得到了你想要把这些线的随机样本。幸运的是python有一个功能可以做到这一点。

import random 
random_choice = random.sample(lines, 1000) 

一旦你得到了你想要他们写回一个新的文件的那些行(虽然我假设你已经知道如何给出一个快速谷歌揭示了这一点),所以我将只包括了完整的一个例子清酒:

with open("new_file.csv", "wb") as sink: 
    sink.write("\n".join(random_choice)) 

它只是将您的选择作为换行符分隔字符串输出到您选择的文件。同样值得注意的是,在这种情况下,你处理的是csv并不重要,只是另一个带有一些行的文件。

如果你正在处理一个非常大的文件或担心占用太多的内存,你应该用一个生成器替换上面的列表理解,然后从中取样,但是这个过程并不那么简单。如果你在做的是更好的性能,你应该看看这个问题想咨询:Python random sample with a generator iterable iterator

+0

我试过这个,并得到以下错误信息。回溯(最近通话最后一个): 文件 “random.py” 41行,在 进口随机 文件 “/auto/data/nhine/Python/random.py”,第42行,在 random_choice =随机.sample(lines,1000) AttributeError:'模块'对象没有属性'sample' – nancyh

+1

你有一个命名空间错误。不要命名你的文件random.py –

+0

我现在已经得到了运行的代码(我打电话给我的文件random.py,这是导致问题),但它似乎并没有产生输出文件。 – nancyh

-1

的基本过程是这样的:

1.打开输入文件

这可以通过基本完成内置open功能。

2.打开输出文件

您可能会使用在步骤1选择了同样的方法,但是你需要在读写模式下打开该文件。

3读取输入文件到一个变量

这往往是最好的一次读取文件的一行,并读取下一个之前这条线工作,但如果内存是不是一个问题,你也可以一次将整个事物读入一个变量。

4.选择选择线

会有任何数量的方式来做到这一点,取决于你是如何做的步骤#3,和您的要求。您可以使用filter或列表理解或for循环与if语句等。最佳方法取决于您的目标的特定约束。

5.写选定行

以你在步骤#4中选择所选择的行,并将它们写入文件。

6.关闭文件

通常是好做法,关闭你打开,以防止资源泄露的文件。

+0

csv模块不打开文件,也不复杂。同样在python中,你不应该明确地关闭一个文件,因为'with'语法非常强大。 OP也在寻找随机选择的行,而不是过滤器。 –

+0

查看文档后,你对csv没有直接打开文件是正确的 - 没有使用它自己。我想“复杂”是非常主观的,但肯定。至于'with',它在内部关闭文件。如果OP决定使用'with',他将会这样做。至于随机部分,我在口语意义上解释为“随机”。如果他确实意味着他会用伪随机生成器对它们进行采样,那么我就会误解。 – Brionius

+0

使用过滤器进行随机抽样非常低效,不直观,如果甚至可以使其工作,通常很难阅读。模块在内部关闭文件和直接调用close方法之间有区别,两者之间的混淆会导致各种愚蠢的错误(如IOErrors关闭已关闭的文件)。我认为这个答案对于另一个问题很有用,但似乎没有考虑OP的问题或python。 –