在Python中从目录中选择随机文件的最佳方法是什么?
编辑:这是我正在做的事情:
import os
import random
import dircache
dir = 'some/directory'
filename = random.choice(dircache.listdir(dir))
path = os.path.join(dir, filename)这是特别糟糕,还是有特别好的方法?
发布于 2009-03-31 15:02:22
import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever关于你编辑的问题:首先,我假设你知道使用dircache的风险,以及它是deprecated since 2.6, and removed in 3.0的事实。
其次,我看不到这里存在任何竞争条件。您的dircache对象基本上是不可变的(在缓存目录列表之后,它永远不会被再次读取),因此从它进行并发读取没有什么坏处。
除此之外,我不明白为什么您会看到这个解决方案有任何问题。这很好。
发布于 2009-03-31 15:10:41
如果你想包含目录,Yuval A的答案是。否则:
import os, random
random.choice([x for x in os.listdir("C:\\") if os.path.isfile(os.path.join("C:\\", x))])发布于 2017-01-29 00:10:51
给出的大多数解决方案的问题是,您将所有输入加载到内存中,这可能会成为大型输入/层次结构的问题。这里有一个改编自Tom Christiansen和Nat Torkington的The Perl Cookbook的解决方案。要获取目录下任意位置的随机文件,请执行以下操作:
#! /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稍微泛化一下,就会得到一个方便的脚本:
$ 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/barhttps://stackoverflow.com/questions/701402
复制相似问题