簡體   English   中英

Python 腳本根據文件擴展名移動文件

[英]Python script to move files based on file extension

我正在嘗試編寫一個腳本來根據文件擴展名將文件從我的下載文件夾移動到相應的文件夾。 下載文件夾中的很多文件都包含在子目錄中,所以我使用的是 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)

這是錯誤。

/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 時,為什么它在尋找 /home/kevin/Videos/Mad Max Beyond Thunderdome.mp4 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 等)移動到文檔(pdf、doc 等)的代碼的一部分,此代碼有效,但不適用於子文件夾中包含的文件。 有什么辦法可以修改此代碼以包含子文件夾? 即使用 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 有一個遞歸 function 所以我將代碼更改為這樣的

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

它拋出了一些錯誤消息,但它現在實際上正在工作。

這可能有效:

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)

你會注意到我不是在移動文件而是在復制它們。 因此,一旦您確認一切正常,您就可以從“下載”目錄中刪除文件。

嘗試提及絕對路徑(C:\ 或 D:\ 或 E:\)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM