python-3.x - 我正在尝试“随机播放”一个音乐文件夹,并且 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()
'''
它应该随机编号文件而不为文件选择相同的值两次,但它会这样做,我不知道为什么。
解决方案
当您第一次调用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()
一次完成所有操作。
推荐阅读
- python - 从pyspark中第一个rdd的两个基于重复计数的rdds创建对rdd?
- cordova - Cordova 访问 www 下的文件
- python - 在单个列中按多年分组并绘制堆叠的结果
- docker - 在 nginx 反向代理后面的 docker-compose 服务中请求时 axios ECONNREFUSED
- javascript - scrollIntoView() 无法使用普通 JS
- php - 为什么 WooCommerce REST API 似乎不起作用?
- javascript - 将 html 文本框值传递给 innerhtml 文本框
- javascript - eclipse-plugins "JSHint' 启动太慢
- python - dict.get() 用于使用 python 的多维字典中的每个事件
- html - 如何控制 HTML 容器标签的间距/缩进?