shutil.move不会删除源文件

时间:2014-02-14 17:58:43

标签: python move shutil

这里的新人Python家伙。我写过我认为是一个相当简单的脚本,用于从照片和视频中提取创建日期元数据,并根据年份和月份将它们移动到新文件夹。我正在使用PIL用于图片和hachoir用于视频元数据。

在大多数情况下,我一直在使用shutil.move。那时所有jpg移动到新文件夹就好了。但所有视频都是COPIED。原始文件保留在源文件夹中。

我的假设是我在脚本中调用的某些进程仍在访问视频文件而不允许删除它。谁能告诉我我搞砸了什么,以及如何释放这些视频文件?

========================

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

2 个答案:

答案 0 :(得分:1)

in运算符表示项是否在集合中(例如列表中的元素)或字符串是其他字符串的子字符串。它不知道您的字符串变量target是目录的名称,也不知道有关检查目录以查看文件是否在其中的任何信息。相反,使用:

if os.path.exists(dest):

答案 1 :(得分:1)

如果没有合适的错误代码,很难说出究竟是什么失败了。在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))

请注意,logging模块可以说很多错误。但是,这超出了这个问题的范围。