【发布时间】:2013-08-21 07:34:24
【问题描述】:
我需要打开一个 csv 文件,随机选择 1000 行并将这些行保存到一个新文件中。我被卡住了,不知道该怎么做。任何人都可以帮忙吗?
【问题讨论】:
标签: python random-sample
我需要打开一个 csv 文件,随机选择 1000 行并将这些行保存到一个新文件中。我被卡住了,不知道该怎么做。任何人都可以帮忙吗?
【问题讨论】:
标签: python random-sample
所以这个问题有两个部分。首先获取 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
【讨论】:
基本流程是这样的:
1.打开输入文件
这可以通过基本的内置open 函数来完成。
2。打开输出文件
您可能会使用在第 1 步中选择的相同方法,但您需要以写入模式打开文件。
3.将输入文件读入变量
通常最好一次读取文件一行,并在读取下一行之前对这一行进行操作,但如果内存不是问题,您也可以一次将整个文件读入一个变量。
4.选择选定的行
根据您执行第 3 步的方式以及您的要求,有多种方法可以做到这一点。您可以使用filter,或列表推导,或带有if 语句的for 循环等。最佳方式取决于您的目标的特定限制。
5.写下选中的行
获取您在第 4 步中选择的选定行并将它们写入文件。
6.关闭文件
通常最好关闭已打开的文件以防止资源泄漏。
【讨论】:
with 语法非常强大。 OP 也在寻找随机选择的行,而不是过滤器。
with,它会在内部关闭文件。如果 OP 决定使用with,无论如何他都会这样做。而对于随机部分,我用通俗的理解来解释“随机”。如果他真的是说要使用伪随机生成器对它们进行采样,那我就误解了。