首页 > 解决方案 > 我正在尝试“随机播放”一个音乐文件夹,并且 random.choice() 不断选择应该删除的内容时出现错误

问题描述

我正在尝试制作一个 python 脚本,从列表中随机重命名文件,并且我在其上使用了 numbers.remove(place) 但它一直在选择应该已删除的值。

我以前只使用 random.randint 但现在我已经开始从列表中选择,然后从列表中删除选择的值,但它似乎继续选择选择的值。

'''Python

from os import chdir, listdir, rename
from random import choice


def main():
    chdir('C:\\Users\\user\\Desktop\\Folders\\Music')
    for f in listdir():
        if f.endswith('.mp4'):
            numbers = [str(x) for x in range(0, 100)]
            had = []
            print(f'numbers = {numbers}')
            place = choice(numbers)
            print(f'place = {place}')
            numbers.remove(place)
            print(f'numbers = {numbers}')
            while place in had:
                input('Place has been had.')
                place = choice(numbers)
            had.append(place)
            name = place + '.mp4'
            print(f'name = {name}')
            print(f'\n\nRenaming {f} to {name}.\n\n')
            try:
                rename(f, name)
            except FileExistsError:
                pass


if __name__ == '__main__':
    main()

'''

它应该随机编号文件而不为文件选择相同的值两次,但它会这样做,我不知道为什么。

标签: python-3.xfile-rename

解决方案


当您第一次调用listdir()时,这与您在整个时间内迭代的列表相同。是的,您正在更改目录的内容,但 python 并不真正关心这一点,因为您只在特定时间点询问目录的内容- 在您开始修改它之前。

我将分两个单独的步骤执行此操作:

# get the current list of files in the directory
dirlist = os.listdir()
# choose a new name for each file
to_rename = zip(
    dirlist, 
    [f'{num}.mp4' for num in random.sample(range(100), len(dirlist))]
)
# actually rename each file
for oldname, newname in to_rename:
    try:
        os.rename(oldname, newname)
    except FileExistsError:
        pass

这种方法比您使用的方法更简洁。首先,我random.sample()在可迭代对象range(100)上使用从该范围生成非重叠数字(无需had像现在一样执行额外的使用步骤)。我生成了所需数量的文件,然后使用内置zip()函数将原始文件名与这些新数字绑定在一起。

然后,我rename()一次完成所有操作。


推荐阅读