【问题标题】:Selecting random rows with python and writing to a new file [closed]使用python选择随机行并写入新文件[关闭]
【发布时间】:2013-08-21 07:34:24
【问题描述】:

我需要打开一个 csv 文件,随机选择 1000 行并将这些行保存到一个新文件中。我被卡住了,不知道该怎么做。任何人都可以帮忙吗?

【问题讨论】:

    标签: python random-sample


    【解决方案1】:

    所以这个问题有两个部分。首先获取 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

    【讨论】:

    • 我试过这个并收到以下错误消息。 Traceback(最近一次调用最后一次):文件“random.py”,第 41 行,在 中导入随机文件“/auto/data/nhine/Python/random.py”,第 42 行,在 random_choice = random .sample(lines, 1000) AttributeError: 'module' object has no attribute 'sample'
    • 您遇到了命名空间错误。不要将文件命名为 random.py
    • 我现在已经运行了代码(我调用了我的文件 random.py,这导致了问题),但它似乎没有生成输出文件。
    • 啊,现在可以使用了,谢谢。
    【解决方案2】:

    基本流程是这样的:

    1.打开输入文件

    这可以通过基本的内置open 函数来完成。

    2。打开输出文件

    您可能会使用在第 1 步中选择的相同方法,但您需要以写入模式打开文件。

    3.将输入文件读入变量

    通常最好一次读取文件一行,并在读取下一行之前对这一行进行操作,但如果内存不是问题,您也可以一次将整个文件读入一个变量。

    4.选择选定的行

    根据您执行第 3 步的方式以及您的要求,有多种方法可以做到这一点。您可以使用filter,或列表推导,或带有if 语句的for 循环等。最佳方式取决于您的目标的特定限制。

    5.写下选中的行

    获取您在第 4 步中选择的选定行并将它们写入文件。

    6.关闭文件

    通常最好关闭已打开的文件以防止资源泄漏。

    【讨论】:

    • csv模块不打开文件,也不复杂。同样在 python 中,您永远不必显式关闭文件,因为with 语法非常强大。 OP 也在寻找随机选择的行,而不是过滤器。
    • 查看文档后,您对 csv 不直接打开文件是正确的 - 我自己没有使用过。我猜“复杂”是相当主观的,但可以肯定。至于with,它会在内部关闭文件。如果 OP 决定使用with,无论如何他都会这样做。而对于随机部分,我用通俗的理解来解释“随机”。如果他真的是说要使用伪随机生成器对它们进行采样,那我就误解了。
    • 使用过滤器进行随机抽样是非常低效、不直观的,而且如果你能让它工作,通常也很难阅读。模块在内部关闭文件和直接调用 close 方法是有区别的,两者之间的混淆会导致各种愚蠢的错误(比如 IOErrors 关闭已经关闭的文件。)我认为这个答案对于另一个问题会很好,但似乎没有考虑到OP的问题或python。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2013-03-08
    • 2016-06-11
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多