我正试图编写一个python脚本,将所有音乐文件从我的整个pc移动到一个特定的文件夹。它们分散在各处,我想把它们都集中在一个地方,所以我不想复制它们,而是完全移动它们。
我已经能够用这个脚本制作所有文件的列表:
import os
targetfiles = []
extensions = (".mp3", ".wav", ".flac")
for root, dirs, files in os.walk('/'):
for file in files:
if file.endswith(extensions):
targetfiles.append(os.path.join(root, file))
print(targetfiles)
这将打印出一个包含所有文件的列表,但是我现在不得不移动它们。
我用不同的代码做了很多不同的尝试,这是其中之一:
import os
import shutil
targetfiles = []
extensions = (".mp3", ".wav", ".flac")
for root, dirs, files in os.walk('/'):
for file in files:
if file.endswith(extensions):
targetfiles.append(os.path.join(root, file))
new_path = 'C:/Users/Nicolaas/Music/All' + file
shutil.move(targetfiles, new_path)
但是我所尝试的一切都给了我一个错误:
TypeError: rename: src should be string, bytes or os.PathLike, not list
我想我已经达到了收集这些的极限,因为我才刚刚开始学习Python,但如果有人能给我指出正确的方向,我将非常感激!
您正在尝试将文件列表移动到新位置,但是shutil.move
函数期望将单个文件作为第一个参数。要将targetfiles
列表中的所有文件移动到新位置,必须使用循环逐个移动每个文件。
for file in targetfiles:
shutil.move(file, new_path)
如果需要,还可以在新路径'C:/Users/Nicolaas/Music/All/'
编辑:您可以使用if
语句将某些文件夹从搜索中排除。
for root, dirs, files in os.walk('/'):
if any(folder in root for folder in excluded_folders):
continue
for file in files:
if file.endswith(extensions):
targetfiles.append(os.path.join(root, file))
其中excluded_folder
是不需要的文件夹列表,如:excluded_folders = ['Program Files', 'Windows']
我建议使用glob
进行匹配:
import glob
def match(extension, root_dir):
return glob.glob(f'**\*.{extension}', root_dir=root_dir, recursive=True)
root_dirs = ['C:\Path\to\Albums', 'C:\Path\to\dir\with\music\files']
excluded_folders = ['Bieber', 'Eminem']
extensions = ("mp3", "wav", "flac")
targetfiles = [f'{root_dir}\{file_name}' for root_dir in root_dirs for extension in extensions for file_name in match(extension, root_dir) if not any(excluded_folder in file_name for excluded_folder in excluded_folders)]
然后将这些文件移动到new_path