1

このプログラムは、次のようにコマンド ラインから実行することになっています。

python Filename Folder_photos_are_in New_Prefix

ファイルの名前を変更するだけでよいのですが、機能していなかったので、実行中に各機能を個別に出力しました。SortByMTime 関数がリストから最後のファイルを除くすべてのファイルを削除するまで、問題なく動作しているようです。

コードは次のとおりです。

    import sys
    import os
    import random

    def filterByExtension(root, allfiles, extensions):
        files = []
        for f in allfiles:
            hasExt = f.rfind('.')
            if(hasExt > 0):
                ext = f[hasExt+1::].lower()
                if(ext in extensions):
                    f2 = os.path.join(root, f)
                    if(os.path.isfile(f2)):
                        files.append(f)
                    else:
                        print "Matching irregular file " + f
        return files


    def sortByMTime(root, matching):
        photos = []
        for f in matching:
            path = os.path.join(root, f)
            mtime = os.path.getmtime(path)
            photos.append((mtime, f))
            photos.sort()
        return photos

    def assignNames(prefix, inorder):
        kount = str(len(inorder))
        digits = len(kount)
        template = '%%0%dd' % digits
        newnames={}
        kount = 0
        for i in inorder:
            kount += 1
            s = template % kount
            newnames [i[1]] = prefix+s+'.'+i[1].split('.')[1]
        return newnames
        print newnames

    def makeTempName(allfiles):
        r = random.randrange(0,1000000000)
        name = "__temp%i__" % r
        while name in allfiles:
            r+=1
            name = "__temp%i__" % r
        return name

    def makeScript(inorder, newnames, tempname):
        chain = []
        inthechain = {}
        script = []
        for i in inorder:
            if i not in newnames:
                continue
            if newnames[i] == id:
                del newnames[i]
                continue
            if newnames[i] not in newnames:
                target = newnames[i]
                script.append( (i,target) )
                del newnames[i]
                    continue
            else:
                link = i
                while True:
                    target = newnames[i]
                    chain.append( (link, target) )
                    inthechain[link] = True
                    link = target
                    if link not in newnames:
                        break
            chain.reverse()
            for (a, b) in chain:
                print "This is in the chain: "
                print chain
                script.append(a,b)
                del newnames[a]
        return script

    def doRenames(root, script):
        for (old, new) in script:
            print "%s -> %s" %(old, new)
            fulloldpath=os.path.join(root, old)
                fullnewpath = os.path.join(root, new)
            if os.path.exists(fullnewpath):
                print "File already exists"
                os.exit(1)
            else:
                os.rename(fulloldpath, fullnewpath)




    def main():
        usrdir = []
        allfiles = []
        path = []
        prefix = ''
        args = sys.argv
        args.pop(0)  #remove first thing from list
        if len(args) == 2: #Directory and Prefix are provided
            print "Directory: ", args[0]
            print "Prefix: ", args[1]
            usrdir = args[0]
            path = os.path.abspath(usrdir)
            prefix = os.path.basename(path)
        if len(args) == 1: #Only directory is provided
            args.append(args[0]) #Makes the directory name the prefix as well
            print "Directory: ", args[0]
            print "Prefix: ", args[1]
            usrdir = args[0]
            path = os.path.abspath(usrdir)
            prefix = os.path.basename(path)
        if len(args) == 0 or len(args) > 2:  #ends the programs because wrong number of arguments.
            print "INVALID Number of Arguments:"
            print "Usage: python bulkrename.py <directory> [<prefix>]"    
            exit(1)
        allfiles = os.listdir(usrdir)
        print "Printout of allfiles"
        print allfiles
        print
        root = os.path.abspath(args[0])
        print "root: ", root
        print
        extensions = ['jpeg', 'jpg', 'png', 'gif']   
        print "What Extensions should be able to be used: " 
        print extensions
        print
        matching = filterByExtension(root, allfiles, extensions)
        print "What comes out of filterByExtension"
        print matching
        print
        inorder = sortByMTime(path, matching)
        print "What comes out of sortByMTime"
        print inorder
        print

        newnames = assignNames(prefix, inorder)
        print "What comes out of assignNames"
        print newnames
        print
        tempname = makeTempName(allfiles)
        print "What comes out of makeTempName"
        print tempname
        print
        script = makeScript(inorder, newnames, tempname)
        print "What comes out of makeScript"
        print script
        print
        doRenames(path, script)
        print "What comes out of doRenames"
        print doRenames
        print

    main()

ここに端末からの出力があります

    virus-haven:CS1410 chrislebaron$ python bulkrenamer.py bulkrename test
    Directory:  bulkrename
    Prefix:  test
    Printout of allfiles
    ['.DS_Store', '20120902Snow_Canyon02.JPG', '20120902Snow_Canyon03.JPG',         '20120902Snow_Canyon05.JPG', '20120902Snow_Canyon06.JPG', '20120902Snow_Canyon08.JPG',         '20120902Snow_Canyon09.JPG', '20120902Snow_Canyon11.JPG', '20120902Snow_Canyon12.JPG',         'airplane.png', 'BackNoText.jpg', 'blah', 'FrontNoText.jpg', 'glitchbusters.jpg',         'IMG_7663.JPG', 'IMG_7664.JPG', 'Pomegranates.jpg', 'rccar.png']

    root:  /Users/chrislebaron/Documents/School/CS1410/bulkrename

    What Extensions should be able to be used: 
    ['jpeg', 'jpg', 'png', 'gif']

    What comes out of filterByExtension
    ['20120902Snow_Canyon02.JPG', '20120902Snow_Canyon03.JPG', '20120902Snow_Canyon05.JPG', '20120902Snow_Canyon06.JPG', '20120902Snow_Canyon08.JPG', '20120902Snow_Canyon09.JPG', '20120902Snow_Canyon11.JPG', '20120902Snow_Canyon12.JPG', 'airplane.png', 'BackNoText.jpg', 'FrontNoText.jpg', 'glitchbusters.jpg', 'IMG_7663.JPG', 'IMG_7664.JPG', 'Pomegranates.jpg', 'rccar.png']

    What comes out of sortByMTime
    [(1322960835.0, 'rccar.png')]

    What comes out of assignNames
    {'rccar.png': 'bulkrename1.png'}

    What comes out of makeTempName
    __temp55210675__

    What comes out of makeScript
    []

    What comes out of doRenames
    <function doRenames at 0x100dede60>

    virus-haven:CS1410 chrislebaron$ 
4

1 に答える 1

0

インデントを間違え、スペースとタブを混ぜ合わせました。確認に使用python -ttします。

于 2012-09-05T00:14:08.763 に答える