首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从目录中选择随机文件的最佳方法

从目录中选择随机文件的最佳方法
EN

Stack Overflow用户
提问于 2009-03-31 14:58:41
回答 6查看 92.7K关注 0票数 52

在Python中从目录中选择随机文件的最佳方法是什么?

编辑:这是我正在做的事情:

代码语言:javascript
运行
复制
import os
import random
import dircache

dir = 'some/directory'
filename = random.choice(dircache.listdir(dir))
path = os.path.join(dir, filename)

这是特别糟糕,还是有特别好的方法?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-31 15:02:22

代码语言:javascript
运行
复制
import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever

关于你编辑的问题:首先,我假设你知道使用dircache的风险,以及它是deprecated since 2.6, and removed in 3.0的事实。

其次,我看不到这里存在任何竞争条件。您的dircache对象基本上是不可变的(在缓存目录列表之后,它永远不会被再次读取),因此从它进行并发读取没有什么坏处。

除此之外,我不明白为什么您会看到这个解决方案有任何问题。这很好。

票数 97
EN

Stack Overflow用户

发布于 2009-03-31 15:10:41

如果你想包含目录,Yuval A的答案是。否则:

代码语言:javascript
运行
复制
import os, random

random.choice([x for x in os.listdir("C:\\") if os.path.isfile(os.path.join("C:\\", x))])
票数 9
EN

Stack Overflow用户

发布于 2017-01-29 00:10:51

给出的大多数解决方案的问题是,您将所有输入加载到内存中,这可能会成为大型输入/层次结构的问题。这里有一个改编自Tom Christiansen和Nat Torkington的The Perl Cookbook的解决方案。要获取目录下任意位置的随机文件,请执行以下操作:

代码语言:javascript
运行
复制
#! /usr/bin/env python
import os, random
n=0
random.seed();
for root, dirs, files in os.walk('/tmp/foo'):
  for name in files:
    n += 1
    if random.uniform(0, n) < 1:
        rfile=os.path.join(root, name)
print rfile

稍微泛化一下,就会得到一个方便的脚本:

代码语言:javascript
运行
复制
$ cat /tmp/randy.py
#! /usr/bin/env python
import sys, random
random.seed()
n = 1
for line in sys.stdin:
  if random.uniform(0, n) < 1:
      rline=line
  n += 1
sys.stdout.write(rline)

$ /tmp/randy.py < /usr/share/dict/words 
chrysochlore

$ find /tmp/foo -type f | /tmp/randy.py
/tmp/foo/bar
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/701402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档