Python shutil.move不';不要删除源文件

Python shutil.move不';不要删除源文件,python,move,shutil,Python,Move,Shutil,新来的巨蟒。我编写了一个相当简单的脚本,可以从照片和视频中提取创建日期元数据,并根据年份和月份将其移动到新文件夹中。我使用PIL表示图片,使用hachoir表示视频元数据 在我实际使用shutil.move之前,大部分时间我都在使用它。在这一点上,所有jpg的移动到新的文件夹刚刚好。但是所有的视频都被复制了。原始文件保留在源文件夹中 我的假设是,我在脚本期间调用的某些进程仍然在访问视频文件,并且不允许删除它。有人能告诉我我搞砸了什么,我如何才能释放这些视频文件进行移动吗 ============

新来的巨蟒。我编写了一个相当简单的脚本,可以从照片和视频中提取创建日期元数据,并根据年份和月份将其移动到新文件夹中。我使用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,老实说,我认为这只是我努力使这项工作成功的最新体现。我敢肯定,在第一次尝试时,它们都以相同的方式运行,并将其更改为此,以查看是否有效。