Hướng dẫn how do i generate a random file from a directory in python? - làm cách nào để tạo một tệp ngẫu nhiên từ một thư mục trong python?

Cách tốt nhất để chọn một tệp ngẫu nhiên từ một thư mục trong Python là gì?

Chỉnh sửa: Đây là những gì tôi đang làm:

import os
import random
import dircache

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

Điều này đặc biệt xấu, hay có một cách đặc biệt tốt hơn?

Đã hỏi ngày 31 tháng 3 năm 2009 lúc 14:58Mar 31, 2009 at 14:58

Hướng dẫn how do i generate a random file from a directory in python? - làm cách nào để tạo một tệp ngẫu nhiên từ một thư mục trong python?

JasonsmithjasonsmithJasonSmith

71.5K22 Huy hiệu vàng121 Huy hiệu bạc147 Huy hiệu đồng22 gold badges121 silver badges147 bronze badges

0

import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever

Về câu hỏi đã chỉnh sửa của bạn: Đầu tiên, tôi cho rằng bạn biết những rủi ro của việc sử dụng

import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever
2, cũng như thực tế là nó không được chấp nhận kể từ 2.6 và bị xóa trong 3.0.

Thứ hai, tôi không thấy bất kỳ điều kiện chủng tộc nào tồn tại ở đây. Đối tượng

import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever
2 của bạn về cơ bản là bất biến (sau khi danh sách thư mục được lưu trữ, nó không bao giờ được đọc nữa), vì vậy không có tác hại nào trong các lần đọc đồng thời từ nó.

Ngoài ra, tôi không hiểu tại sao bạn thấy bất kỳ vấn đề nào với giải pháp này. Nó là tốt.

Đã trả lời ngày 31 tháng 3 năm 2009 lúc 15:02Mar 31, 2009 at 15:02

Hướng dẫn how do i generate a random file from a directory in python? - làm cách nào để tạo một tệp ngẫu nhiên từ một thư mục trong python?

Yuval Adamyuval AdamYuval Adam

158K91 Huy hiệu vàng300 Huy hiệu bạc389 Huy hiệu Đồng91 gold badges300 silver badges389 bronze badges

2

Nếu bạn muốn bao gồm các thư mục, câu trả lời của Yuval A. Nếu không thì:

import os, random

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

Đã trả lời ngày 31 tháng 3 năm 2009 lúc 15:10Mar 31, 2009 at 15:10

Mavnnmavnnmavnn

8.7834 Huy hiệu vàng31 Huy hiệu bạc 50 Huy hiệu Đồng4 gold badges31 silver badges50 bronze badges

1

Giải pháp đơn giản nhất là sử dụng các phương thức Os.ListDir & Random.Choiceos.listdir & random.choice methods

random_file=random.choice(os.listdir("Folder_Destination"))

Hãy xem từng bước một bước:--

1} Phương thức Os.ListDir Trả về danh sách chứa tên của các mục (tệp) trong đường dẫn được chỉ định.os.listdir method returns the list containing the name of entries (files) in the path specified.

2} Danh sách này sau đó được chuyển dưới dạng tham số cho Random.choice phương thức trả về một tên tệp ngẫu nhiên từ danh sách.random.choice method which returns a random file name from the list.

3} Tên tệp được lưu trữ trong biến ngẫu nhiên_file.random_file variable.


Xem xét một ứng dụng thời gian thực

Dưới đây là mã python mẫu sẽ chuyển các tệp ngẫu nhiên từ thư mục này sang thư mục khác

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)

Bạn có thể kiểm tra toàn bộ dự án trên trình chọn tệp ngẫu nhiên GitHubRandom File Picker


Để bổ sung tham khảo về phương thức Os.ListDir & Random.Choice, bạn có thể tham khảo hướng dẫn tìm hiểu Pythonos.listdir & random.choice method you can refer to tutorialspoint learn python

Os.ListDir:- Phương thức python listDir ()

Random.Choice:- Phương thức Python Lựa chọn ()


Đã trả lời ngày 1 tháng 10 năm 2018 lúc 7:22Oct 1, 2018 at 7:22

Hướng dẫn how do i generate a random file from a directory in python? - làm cách nào để tạo một tệp ngẫu nhiên từ một thư mục trong python?

Vấn đề với hầu hết các giải pháp được đưa ra là bạn tải tất cả đầu vào của mình vào bộ nhớ, điều này có thể trở thành vấn đề cho các đầu vào/phân cấp lớn. Đây là một giải pháp được chuyển thể từ cuốn sách nấu ăn Perl của Tom Christiansen và Nat Torkington. Để có được một tệp ngẫu nhiên ở bất cứ đâu bên dưới một thư mục:

#! /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

Tổng quát hóa một chút làm cho một kịch bản tiện dụng:

$ 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

Đã trả lời ngày 28 tháng 1 năm 2017 lúc 16:10Jan 28, 2017 at 16:10

Keithpjolleykeithpjolleykeithpjolley

1.9861 Huy hiệu vàng16 Huy hiệu bạc19 Huy hiệu đồng1 gold badge16 silver badges19 bronze badges

0

Giải pháp bất khả tri về ngôn ngữ:

1) Nhận tổng số không. của các tập tin trong thư mục được chỉ định.

2) Chọn một số ngẫu nhiên từ 0 đến [Tổng số không. của các tập tin - 1].

3) Nhận danh sách các tên tệp là một bộ sưu tập được lập chỉ mục phù hợp hoặc như vậy.

4) Chọn phần tử thứ n, trong đó n là số ngẫu nhiên.

Đã trả lời ngày 31 tháng 3 năm 2009 lúc 15:04Mar 31, 2009 at 15:04

Hướng dẫn how do i generate a random file from a directory in python? - làm cách nào để tạo một tệp ngẫu nhiên từ một thư mục trong python?

karim79karim79karim79

337K67 Huy hiệu vàng411 Huy hiệu bạc405 Huy hiệu Đồng67 gold badges411 silver badges405 bronze badges

1

Độc lập với ngôn ngữ được sử dụng, bạn có thể đọc tất cả các tham chiếu đến các tệp trong một thư mục vào một cơ sở dữ liệu như một mảng (một cái gì đó như 'listfiles'), có được độ dài của mảng. Tính một số ngẫu nhiên trong phạm vi '0' đến 'ArrayLpm-1' và truy cập tệp ở chỉ mục nhất định. Điều này nên làm việc, không chỉ trong Python.

Đã trả lời ngày 31 tháng 3 năm 2009 lúc 15:01Mar 31, 2009 at 15:01

Mork0075Mork0075Mork0075

5,8754 Huy hiệu vàng23 Huy hiệu bạc24 Huy hiệu đồng4 gold badges23 silver badges24 bronze badges

Nếu bạn không biết trước đây những tệp nào ở đó, bạn sẽ cần phải có một danh sách, sau đó chỉ cần chọn một chỉ mục ngẫu nhiên trong danh sách.

Đây là một nỗ lực:

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]

Chỉnh sửa: Câu hỏi hiện đề cập đến nỗi sợ "tình trạng chủng tộc", mà tôi chỉ có thể giả định là vấn đề điển hình của các tệp được thêm/xóa trong khi bạn đang trong quá trình cố gắng chọn một tệp ngẫu nhiên.: The question now mentions a fear of a "race condition", which I can only assume is the typical problem of files being added/removed while you are in the process of trying to pick a random file.

Tôi không tin rằng có một cách xung quanh điều đó, ngoài việc ghi nhớ rằng bất kỳ hoạt động I/O nào là "không an toàn", tức là nó có thể thất bại. Vì vậy, thuật toán để mở một tệp được chọn ngẫu nhiên trong một thư mục nhất định nên:

  • Trên thực tế
    import os, random
    random.choice(os.listdir("C:\\")) #change dir name to whatever
    
    4 Tệp đã chọn và xử lý lỗi, vì tệp có thể không còn ở đó
  • Có thể tự giới hạn số lần thử, vì vậy nó không chết nếu thư mục trống hoặc nếu không có tệp nào có thể đọc được

Đã trả lời ngày 31 tháng 3 năm 2009 lúc 15:02Mar 31, 2009 at 15:02

Yuval Adamyuval Adamunwind

158K91 Huy hiệu vàng300 Huy hiệu bạc389 Huy hiệu Đồng64 gold badges464 silver badges595 bronze badges

0

Nếu bạn muốn bao gồm các thư mục, câu trả lời của Yuval A. Nếu không thì:

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()))

Đã trả lời ngày 31 tháng 3 năm 2009 lúc 15:10Dec 22, 2020 at 12:56

Hướng dẫn how do i generate a random file from a directory in python? - làm cách nào để tạo một tệp ngẫu nhiên từ một thư mục trong python?

1

Mavnnmavnnlarge number of files from a larger number of files, and maybe copy or move them in another dir, the proposed approach is of course too slow.

8.7834 Huy hiệu vàng31 Huy hiệu bạc 50 Huy hiệu Đồng

from random import choices
from glob import glob
from shutil import copy

file_list = glob([SRC DIR] + '*' + [FILE EXTENSION])

picked_files = choices(file_list, k=17)

Giải pháp đơn giản nhất là sử dụng các phương thức Os.ListDir & Random.Choice

import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever
0

Đã trả lời ngày 11 tháng 7 lúc 10:21Jul 11 at 10:21

Biobiobio

4591 Huy hiệu vàng4 Huy hiệu bạc16 Huy hiệu đồng1 gold badge4 silver badges16 bronze badges

Mã này không lặp lại tên tệp:

import os, random
random.choice(os.listdir("C:\\")) #change dir name to whatever
1

Random_200_Files = Random_Files (200, list_of_files)

Đã trả lời ngày 27 tháng 7 lúc 6:17Jul 27 at 6:17

Hướng dẫn how do i generate a random file from a directory in python? - làm cách nào để tạo một tệp ngẫu nhiên từ một thư mục trong python?

Aravind Raravind rAravind R

3553 Huy hiệu bạc11 Huy hiệu đồng3 silver badges11 bronze badges