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