从目录中获取单个文件的最有效/最快的方法

时间:2012-11-14 11:57:37

标签: python file directory

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

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

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

注意:我的目录中有很多文件,因此为什么我要避免列出所有文件只选一个。

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

我最终选择使用将存储的索引文件:

  • 要挑选的当前文件的索引(例如:1表示file1.ext,2表示file2.ext等。)
  • 生成的最后一个文件的索引(例如:1999 for file1999.ext)

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

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

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

这是针对我的问题的具体解决方案,对于更通用的解决方案,请阅读接受的答案。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

import random
import os

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

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

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

答案 2 :(得分:1)

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

  1. 打开文本文件
  2. 将文件名设置为列表顶部的名称。
  3. 从列表顶部删除名称
  4. 关闭文本文件
  5. 处理文件名。