从Python目录中选择随机文件的最佳方法是什么?
编辑:以下是我正在做的事情:
import os
import random
import dircache
dir = 'some/directory'
filename = random.choice(dircache.listdir(dir))
path = os.path.join(dir, filename)
这是特别糟糕的,还是有更好的方法?
答案 0 :(得分:57)
import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever
关于您编辑的问题:首先,我假设您了解使用dircache
的风险,以及它是deprecated since 2.6, and removed in 3.0的事实。
其次,我没有看到这里存在任何竞争条件。你的dircache
对象基本上是不可变的(在缓存目录列表之后,它永远不会被再次读取),所以并发读取没有任何危害。
除此之外,我不明白为什么你看到这个解决方案有任何问题。没关系。
答案 1 :(得分:6)
如果你想要包含目录,Yuval A的回答。否则:
import os, random
random.choice([x for x in os.listdir("C:\\") if os.path.isfile(os.path.join("C:\\", x))])
答案 2 :(得分:4)
语言无关解决方案:
1)得到总数。指定目录中的文件。
2)从0到[总数]中选择一个随机数。文件 - 1]。
3)获取文件名列表作为适当索引的集合等。
4)选择第n个元素,其中n是随机数。
答案 3 :(得分:4)
大多数解决方案的问题是您将所有输入加载到内存中,这可能成为大输入/层次结构的问题。以下是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=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=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
答案 4 :(得分:1)
与所使用的语言无关,您可以将对目录中文件的所有引用读入数据结构(如数组)(类似于“listFiles”),获取数组的长度。计算“0”到“arrayLength-1”范围内的随机数,并访问特定索引处的文件。这不仅适用于python。
答案 5 :(得分:1)
如果你事先不知道那里有什么文件,你需要得到一个列表,然后在列表中选择一个随机索引。
这是一次尝试:
import os
import random
def getRandomFile(path):
"""
Returns a random filename, chosen among the files of the given path.
"""
files = os.listdir(path)
index = random.randrange(0, len(files))
return files[index]
编辑:问题现在提到了对“竞争条件”的恐惧,我只能假设在您尝试选择的过程中添加/删除文件的典型问题一个随机文件。
除了记住任何I / O操作本质上是“不安全”之外,我不相信有这种方法,即它可能会失败。因此,在给定目录中打开随机选择的文件的算法应该是:
open()
选择了文件,并处理失败,因为该文件可能不再存在答案 6 :(得分:1)
最简单的解决方案是使用 os.listdir 和 random.choice 方法
random_file=random.choice(os.listdir("Folder_Destination"))
让我们逐步看一下它:-
1} os.listdir 方法返回包含以下名称的列表 指定路径中的条目(文件)。
2}然后将此列表作为参数传递给 random.choice 方法 从列表中返回一个随机文件名。
3}文件名存储在 random_file 变量中。
考虑实时应用
这是一个示例python代码,它将随机文件从一个目录移动到另一个目录
import os, random, shutil
#Prompting user to enter number of files to select randomly along with directory
source=input("Enter the Source Directory : ")
dest=input("Enter the Destination Directory : ")
no_of_files=int(input("Enter The Number of Files To Select : "))
print("%"*25+"{ Details Of Transfer }"+"%"*25)
print("\n\nList of Files Moved to %s :-"%(dest))
#Using for loop to randomly choose multiple files
for i in range(no_of_files):
#Variable random_file stores the name of the random file chosen
random_file=random.choice(os.listdir(source))
print("%d} %s"%(i+1,random_file))
source_file="%s\%s"%(source,random_file)
dest_file=dest
#"shutil.move" function moves file from one directory to another
shutil.move(source_file,dest_file)
print("\n\n"+"$"*33+"[ Files Moved Successfully ]"+"$"*33)
您可以在github上查看整个项目 Random File Picker
有关 os.listdir 和 random.choice 方法的其他参考,您可以参考 tutorialspoint学习python
os.listdir:-Python listdir() method
random.choice:-Python choice() method
答案 7 :(得分:0)
Python 3 具有 pathlib 模块,可用于以更面向对象的方式推理文件和目录:
from random import choice
from pathlib import Path
path: Path = Path()
# The Path.iterdir method returns a generator, so we must convert it to a list
# before passing it to random.choice, which expects an iterable.
random_path = choice(list(path.iterdir()))