[英]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.