Python shutil.move不';不要删除源文件
新来的巨蟒。我编写了一个相当简单的脚本,可以从照片和视频中提取创建日期元数据,并根据年份和月份将其移动到新文件夹中。我使用PIL表示图片,使用hachoir表示视频元数据 在我实际使用shutil.move之前,大部分时间我都在使用它。在这一点上,所有jpg的移动到新的文件夹刚刚好。但是所有的视频都被复制了。原始文件保留在源文件夹中 我的假设是,我在脚本期间调用的某些进程仍然在访问视频文件,并且不允许删除它。有人能告诉我我搞砸了什么,我如何才能释放这些视频文件进行移动吗 ========================Python shutil.move不';不要删除源文件,python,move,shutil,Python,Move,Shutil,新来的巨蟒。我编写了一个相当简单的脚本,可以从照片和视频中提取创建日期元数据,并根据年份和月份将其移动到新文件夹中。我使用PIL表示图片,使用hachoir表示视频元数据 在我实际使用shutil.move之前,大部分时间我都在使用它。在这一点上,所有jpg的移动到新的文件夹刚刚好。但是所有的视频都被复制了。原始文件保留在源文件夹中 我的假设是,我在脚本期间调用的某些进程仍然在访问视频文件,并且不允许删除它。有人能告诉我我搞砸了什么,我如何才能释放这些视频文件进行移动吗 ============
import os.path, time, sys, shutil
from PIL import Image
from PIL.ExifTags import TAGS
from hachoir_core.error import HachoirError
from hachoir_core.cmd_line import unicodeFilename
from hachoir_parser import createParser
from hachoir_core.tools import makePrintable
from hachoir_metadata import extractMetadata
from hachoir_core.i18n import getTerminalCharset
def get_field (exif,field) :
for (k,v) in exif.iteritems():
if TAGS.get(k) == field:
return v
for picture in os.listdir(os.getcwd()):
if picture.endswith(".jpg") or picture.endswith(".JPG"):
print picture
rawMetadata = Image.open(picture)._getexif()
datetime = get_field(rawMetadata, 'DateTime')
datedict = {'year' : datetime[0:4], 'month' : datetime[5:7]}
target = datedict['year']+'-'+ datedict['month']
if not os.path.isdir(target):
newdir = os.mkdir(target)
if picture not in target:
shutil.move(picture, target)
if picture.endswith('.mov') or picture.endswith('.MOV') or \
picture.endswith('mp4') or picture.endswith('.MP4'):
picture, realname = unicodeFilename(picture), picture
parser = createParser(picture, realname)
rawMetadata = extractMetadata(parser)
text = rawMetadata.exportPlaintext()
datedict = {'year' : text[4][17:21], 'month' : text[4][22:24]}
target = datedict['year']+'-'+ datedict['month']
dest = os.path.join(target, picture)
if not os.path.isdir(target):
newdir = os.mkdir(target)
if picture not in target:
try:
shutil.move(picture, dest)
except WindowsError:
pass
运算符中的
表示项目是在集合中(例如列表中的元素)还是字符串是其他字符串的子字符串。它不知道字符串变量target
是目录名,也不知道检查目录以查看其中是否有文件。相反,请使用:
if os.path.exists(dest):
如果没有一个像样的错误代码,很难判断到底是什么失败了。在except
块中使用此选项可获得更多答案:
except WindowsError as e:
print("There was an error copying {picture} to {target}".format(
picture=picture,target=target))
print("The error thrown was {e}".format
(e=e))
print("{picture} exists? {exist}".format(
picture=picture, exist=os.exists(picture))
print("{target} exists? {exist}".format(
target=target,exist=os.exists(target))
请注意,日志记录
模块对于此类错误可以说很多。不过,这已经超出了这个问题的范围。一点注释,如果您使用glob
,您可能会在比较文件名时节省大量的周期对于glob.glob(“*.jpg”)中的图片:#这不区分大小写
。或者,在('.mov','.mp4')中执行if picture.lower()[-4]:#对于电影。仍在努力学习所有这些不同的模块。lolI在WindowsError异常之后立即添加了一个print语句,并且每次运行shutil.move时都会调用它。就像它将文件复制到文件夹中,然后检查它是否在那里,并查看它是否在那里。这可能是阻止shutil.move完成移动过程的原因吗?对于评论来说,这有点冗长。我添加了它作为答案,因为它可能会导致一个解决方案。哦,好的!尽管它看起来像是try/except
块将在捕获冗余时呈现该。此外,EAFP虽然有意思地注意到OP正在将图像复制到“path/to/dir/”
,但将电影复制到“path/to/dir/file.mov”
我更改了Peter建议的位。谢谢你。但是仍然没有删除视频文件.adsmith,老实说,我认为这只是我努力使这项工作成功的最新体现。我敢肯定,在第一次尝试时,它们都以相同的方式运行,并将其更改为此,以查看是否有效。