基于文件扩展名移动文件的Python脚本

2024-05-16 00:03:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个脚本,根据文件扩展名将文件从下载文件夹移动到相应的文件夹。下载文件夹中的很多文件都包含在子目录中,所以我使用的是os.walk。这是我到目前为止得到的信息,但我收到了一些错误消息。到目前为止,我只为一种文件类型编写了代码,只是为了看看它是否有效。当我的代码有效时,我将为最常见的文件类型编写代码。顺便说一句,我在linux上

import os
import shutil

dest_dir = "/home/kevin/Videos"
dest_dir2 = "/home/kevin/Music"
dest_dir3 = "/home/kevin/Documents"
dest_dir4 = "/home/kevin/Pictures"

for root, dirs, files in os.walk("/home/kevin/Downloads"):
    for file in files:
        if(file.endswith(".mp4")):
            print(os.path.join(root,file))
            shutil.move(file, dest_dir)

这是erorrs

/home/kevin/Downloads/Mad Max Beyond Thunderdome 1985 1080p BDRip H264 AAC - KiNGDOM/Mad Max Beyond Thunderdome.mp4
Traceback (most recent call last):
  File "/usr/lib/python3.8/shutil.py", line 788, in move
    os.rename(src, real_dst)
FileNotFoundError: [Errno 2] No such file or directory: 'Mad Max Beyond Thunderdome.mp4' -> '/home/kevin/Videos/Mad Max Beyond Thunderdome.mp4'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/kevin/Documents/move.py", line 13, in <module>
    shutil.move(file, dest_dir)
  File "/usr/lib/python3.8/shutil.py", line 802, in move
    copy_function(src, real_dst)
  File "/usr/lib/python3.8/shutil.py", line 432, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/usr/lib/python3.8/shutil.py", line 261, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: 'Mad Max Beyond Thunderdome.mp4'
[Finished in 0.0s with exit code 1]
[shell_cmd: python -u "/home/kevin/Documents/move.py"]
[dir: /home/kevin/Documents]
[path: /home/kevin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin]

知道我做错了什么吗?如果我能做到这一点,我还想知道是否有办法将包含文件的文件夹移动到目标目录,而不仅仅是文件本身?谢谢

编辑:这一部分似乎很有趣,因为它就在那个目录中不存在,但当实际目录是/home/kevin/Videos/Mad Max Beyond Thunderdome.mp4时,为什么它要在Thunderdome.mp4之外寻找/home/kevin/Videos/Mad Max Beyond Thunderdome 1985 1080p BDRIP H264 AAC-KiNGDOM

FileNotFoundError: [Errno 2] No such file or directory: 'Mad Max Beyond Thunderdome.mp4' -> '/home/kevin/Videos/Mad Max Beyond Thunderdome.mp4'

编辑2:这是我之前编写的代码的一部分,用于将文件从下载移动到文档(pdf、doc等),该代码可以工作,但不适用于包含在子文件夹中的文件。是否有任何方法可以修改此代码以包含子文件夹?i、 e使用os.walk

#moves files from downloads to documents

for file in glob.glob(r'/home/kevin/Downloads/*.txt'):
    print(file)
    shutil.move(file, dest_dir)

for file in glob.glob(r'/home/kevin/Downloads/*.doc'):
    print(file)
    shutil.move(file, dest_dir)

for file in glob.glob(r'/home/kevin/Downloads/*.docx'):
    print(file)
    shutil.move(file, dest_dir)

for file in glob.glob(r'/home/kevin/Downloads/*.epub'):
    print(file)
    shutil.move(file, dest_dir)

for file in glob.glob(r'/home/kevin/Downloads/*.pdf'):
    print(file)
    shutil.move(file, dest_dir)

for file in glob.glob(r'/home/kevin/Downloads/*.djvu'):
    print(file)
    shutil.move(file, dest_dir)

编辑3:我想我找到了一个混乱的解决方案。显然glob有一个递归函数,所以我把代码改成这样

for file in glob.glob('/home/kevin/Downloads/**/*.txt', recursive=True):

它抛出了一些错误消息,但实际上它现在正在工作


Tags: inhomeformoveusrdownloadsdirglob
2条回答

尝试提及绝对路径(C:\或D:\或E:\)

这可能会奏效:

import os
import shutil

old_directory = "/home/kevin/Downloads"
new_directory = "/home/kevin/Videos"
for filename in os.listdir(old_directory):
    if filename.endswith(".mp4"):
        source = os.path.join(old_directory, filename)
        destination = os.path.join(new_directory, filename)
        dest = shutil.copyfile(source, destination)

你会注意到我不是在移动文件,而是在复制它们。因此,一旦您确认一切正常,您就可以从“下载”目录中删除这些文件

相关问题 更多 >