1

使用 Python 从目录中获取单个文件的最有效和最快的方法是什么?

关于我的具体问题的更多详细信息:
我有一个包含大量预生成文件的目录,我只想随机选择一个。因为我知道除了首先列出所有文件之外没有真正有效的从目录中选择随机文件的方法,所以我的文件是用一个已经随机的名称生成的,因此它们已经是随机排序的,我只需要选择第一个文件夹中的文件。

所以我的问题是:如何从我的文件夹中选择第一个文件,而不必从目录中加载整个文件列表(也没有操作系统这样做,我的最佳目标是强制操作系统返回我一个文件,然后停止!)。

注意:我的目录中有很多文件,因此我想避免列出所有文件而只选择一个。

注意2:每个文件只选择一次,然后删除以确保下次只选择新文件(从而确保某种随机性)。

解决方案

我最终选择使用一个索引文件来存储:

  • 要选择的当前文件的索引(例如:file1.ext 为 1,file2.ext 为 2,等等)
  • 最后生成的文件的索引(例如:file1999.ext 为 1999)

当然,这意味着我的文件不再使用随机名称生成,而是使用确定性可递增模式(例如:“file%s.ext”% ID)

因此,我的两个主要操作有一个几乎恒定的时间:

  • 访问文件夹中的下一个文件
  • 计算剩余文件的数量(以便我可以在需要时在后台线程中生成新文件)。

这是针对我的问题的特定解决方案,有关更通用的解决方案,请阅读已接受的答案。

此外,您可能对我发现的这两个其他解决方案感兴趣,这些解决方案可以使用 Python 优化文件和目录访问的访问:

4

3 回答 3

2

1 个目录中没有很多预生成的文件。如果目录中的文件超过“n”个,则将它们划分为子目录。

于 2012-11-14T12:05:59.363 回答
1

只需random.choice()os.listdir()结果上使用:

import random
import os

randomfilename = random.choice(os.listdir(path_to_directory))

os.listdir()按照操作系统给出的顺序返回结果。使用随机文件名不会更改该顺序,只有在目录中添加项目或从目录中删除项目会影响该顺序。

如果您担心文件过多,请不要使用单个目录。相反,使用预先生成的名称设置目录树,随机选择其中一个,然后从那里选择一个文件。

于 2012-11-14T12:02:27.170 回答
1

创建文件时,将最新文件的名称添加到存储在文本文件中的列表中。当您想读取/处理/删除文件时:

  1. 打开文本文件
  2. 将文件名设置为列表顶部的名称。
  3. 从列表顶部删除名称
  4. 关闭文本文件
  5. 处理文件名。
于 2012-11-14T13:46:25.800 回答