簡體   English   中英

將文件移出文件夾 Python

[英]Move Files out of Folders Python

我把很多內容保存到一個目錄 Q:\Move_Folder

有時會直接保存那個內容,比如Q:\Move_Folder\video.mkv

大多數時候它會自動保存為:Q:\Move_Folder\Subfolder\video.mkv

我希望遍歷 Move_Folder 中的每個子文件夾,提取以特定文件擴展名結尾的所有內容,然后將其移出文件夾,這樣它就是 Q:\Move_Folder\video.mkv

我已經運行了這個腳本,它在從 Q:\Completed 移動到 Q:\Move_Folder 時有效,並且會移動所有正確的文件擴展名,但是當從 Q:\Move_Folder 中執行時,我目前沒有返回任何錯誤,但沒有文件被移動:

代碼:

import os
import os.path
import shutil

target = r'Q:\Move_Folder'

ext = ['.mkv', '.mp4','.avi','.srt','.ass']
movedFiles = []

from pathlib import Path
rootdir = Path(r"Q:\Move_Folder")
os.path.isfile(rootdir)


for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        if rootdir.is_dir():
            pass
        else:
            file.endswith(tuple(ext))
            movedFiles.append(file)
            fullfile = os.path.join(subdir, file)
            shutil.move(fullfile, target)
            print("FileMoved: " + file)

如果有人有任何類似的需求,將在下面添加最終產品,我認為這非常有用。 對其進行了測試,它適用於我想要的。

import os
import os.path
import shutil

from pathlib import Path

# Setting all variables
target = r'Q:\Move_Folder'
deletedFiles = []
# If you don't have .r00-.r09 here they will not be deleted, because numbers do not
# increment as 00-09 they increment as 0-9
r = ['.r00', '.r01', '.r02', '.r03', '.r04', '.r05', '.r06', '.r07', '.r08', '.r09']
ext2 = ['.nfo', '.jpg', '.rar', '.jpg', '.png', '.sfv', '.NFO']
rootdirss = r"Q:\Move_Folder"
x = 00
ext = ('.mkv', '.mp4','.avi','.srt','.ass')
movedFiles = []
rootdir = Path(target)

# Search for Files that I want to keep, and move them to Move_Folder out of their pre-existing folder
for file in rootdir.rglob("*"):
    if file.name.endswith(ext) and file.parent != rootdir:
        print(file.parent)
        movedFiles.append(file)
        file.rename(rootdir / file.name)
        print("File Moved To Move_Folder: " + file.name)

# Iterate through x which is for .r00 files, adding them 
# to .r00 through .r150 for deleting purposes.
while x < 150:
    r.append(".r" + str(x))
    x += 1

# Main content for deleting junk, will first iterate through ext for normal file extensions
# Then will iterate through .r00 files and deleting them
for subdir, dirs, files in os.walk(rootdirss):
    for file in files:
        if file.endswith(tuple(ext2)):
            deletedFiles.append(file)
            os.remove(os.path.join(subdir, file))
            print("Deleted: " + file)
        # Begin of deleting .r00 files    
        for i in r:
            if file.endswith(i):
                deletedFiles.append(file)
                os.remove(os.path.join(subdir, file))
                print("Deleted: " + file)        

# Search for any directories (Folders), and delete them
for dir in rootdir.rglob('*'):
    if dir.name.endswith(ext):
        pass
    else:
        print("Deleting Folder: ", dir)
        shutil.rmtree(dir)

您已經邁出了使用pathlib的第一步,為什么不一路使用 go 呢? 看看它有多簡單:

from pathlib import Path

target = r'Q:\Move_Folder'

ext = ('.mkv', '.mp4','.avi','.srt','.ass')
movedFiles = []

rootdir = Path(target)

for file in rootdir.rglob("*"):
    if file.name.endswith(ext) and file.parent != rootdir:
        movedFiles.append(file)
        file.rename(rootdir / file.name)
        print("FileMoved: " + file.name)

pathlib在處理路徑時非常有用和強大。 在我遇到的大多數用例中,它比使用os.path等價物簡單得多,而且平台安全得多。

這里的第一個問題是rootdir.is_dir()將始終為真,因為Q:Move_Folder是一個目錄並且rootdir的值永遠不會發生變化。

除非您需要能夠在運行時添加更多擴展,否則您似乎也將ext轉換為一個元組,而您可能應該將它作為一開始的元組。

此外,您沒有對file.endswith(tuple(ext))的返回類型做任何事情

您可能可以將其簡化為:

for root, dirs, files, os.walk(rootdir):
    for file in files:
        if file.endswith(tuple(ext)):
            shutil.move(os.path.join(root, name), target)
            print("FileMoved: " + file)

暫無
暫無

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

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