Python脚本将特定文件类型从所有目录移动到一个文件夹



我正试图编写一个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

相关内容

  • 没有找到相关文章

最新更新