Python 如何从文件夹中随机选择文件,而不将所有文件读取到内存

Python 如何从文件夹中随机选择文件,而不将所有文件读取到内存,python,file,Python,File,我有一个包含大量文件的文件夹。我想迭代地选择一个随机文件 目前,我使用glob.glob()获取所有可能的文件,然后使用random.sample()在每次迭代中随机获取一些文件。有时我的电脑会因此显示“内存不足” 是否有某种方法可以在不首先查找所有文件的情况下从文件夹中随机选择一个文件 代码: mfcc\u files\u paths=random.sample(glob.glob(self.path\u to\u paths+“\\mfcc\\*.mfcc.npy”)、int(n\u sam

我有一个包含大量文件的文件夹。我想迭代地选择一个随机文件

目前,我使用
glob.glob()
获取所有可能的文件,然后使用
random.sample()
在每次迭代中随机获取一些文件。有时我的电脑会因此显示“内存不足”

是否有某种方法可以在不首先查找所有文件的情况下从文件夹中随机选择一个文件

代码:

mfcc\u files\u paths=random.sample(glob.glob(self.path\u to\u paths+“\\mfcc\\*.mfcc.npy”)、int(n\u samples))

控制台: 文件“blah blah blah.py”,第109行,以get_random_mfcc_txt_成对形式 mfcc_files_paths=random.sample(glob.glob(self.path_to_paths+“\mfcc\*.mfcc.npy”),int(n_samples)) 文件“C:\Users\dan\AppData\Local\Programs\Python\Python36\lib\glob.py”,第20行,在glob中 返回列表(iglob(路径名,递归=递归))
MemoryError

glob
模块还具有一个
iglob
函数,该函数返回所有文件的迭代器,因此不会占用所有内存,但不能将
random.sample()
与迭代器一起使用(因为它不知道总数)。因此,如果您只需要一个文件,可能只需要使用一个随机数:

for file in glob.iglob(path):
    if random.random() < 0.1:   # you can pick any number here
         break
glob.iglob(路径)中文件的
:
如果random.random()<0.1:#您可以在此处选择任何数字
打破
然后,
文件
将是“随机选择”的文件。
希望有帮助:)

如果您确实无法将所有这些文件保存在一个目录中,您可以:

  • 计算使用
    iglob
    os.scandir
  • 在范围内选择一个随机数
  • 迭代到这个数字
例如:

import glob,random

path = "/path/to/dir/*"

nb_files = sum(1 for _ in glob.iglob(path))
index = random.randrange(0,nb_files)
g = glob.iglob(path)
for _ in range(index):
    file = next(g)
这可能会扫描目录两次,但这是内存与磁盘访问之间的折衷


将来,您可能希望将文件存储在单独的目录中(最简单的方法是将以“A”开头的文件存储在一个名为“A”的目录中,等等,可能使用多个目录级别),然后随机选择一个文件会容易得多:首先选择目录并重复,直到达到“文件”级别。更多的调用
random.randint
,但是更快的磁盘访问速度。

如果您添加了导致OoM的代码,我们将能够更有效地提供帮助。请注意,虽然文件在技术上是随机选择的,但它不是一个统一的样本。具体来说,靠近迭代器开头的文件比靠近迭代器开头的文件被选中的可能性要高得多end@Hamms是的,我相信有更好的取样方法,而不是每次随机抽取一个数字。也许我们应该用它们出现的位置的
索引来惩罚它?重新嵌套目录:如果目录大小不同,那么这种方法将有偏差,除非您按大小加权,这仍然需要对每个子目录进行目录扫描。这是真的,因此您无法避免扫描所有文件