4

これはおそらく簡単な質問ですが、私はPythonとプログラミング全般にまったく慣れていません。

ソースの場所のディレクトリ構造をミラーリングしながら、ある場所から別の場所に.mp3ファイルをコピー/移動する簡単なプログラムに取り組んでいます。これまでのところ機能していますが、ソースフォルダーにmp3ファイルが含まれていなくても、宛先の場所に新しいフォルダーが作成されます。ソースに .mp3 が含まれている場合にのみ、新しいディレクトリを作成したいと考えています。そうしないと、宛先に空のフォルダーが多数作成される可能性があります。

これが私がこれまでに持っているものです:

import os
import shutil #Used for copying files

##CONFIG
source_dir = "C:\Users\username\Desktop\iTunes\\" #set the root folder that you want to     scan and move files from.  This script will scan recursively.
destPath = "C:\Users\username\Desktop\converted From iTunes" #set the destination root that you want to move files to.  Any non-existing sub directories will be created.
ext = ".mp3" #set the type of file you want to search for.
count = 0 #initialize counter variable to count number of files moved
##

##FIND FILES
for dirName, subdirList, fileList in os.walk(source_dir):

    #set the path for the destination folder(s)
    dest = destPath + dirName.replace(source_dir, '\\') 

    #if the source directory doesn't exist in the destination folder
    #then create a new folder
    if not os.path.isdir(dest):
        os.mkdir(dest)
        print('Directory created at: ' + dest)

    for fname in fileList:
        if fname.endswith(ext) :
            #determine source & new file locations
            oldLoc = dirName + '\\' + fname
            newLoc = dest + '\\' + fname

            if os.path.isfile(newLoc): # check to see if the file already exists.  If it does print out a message saying so.
                print ('file "' + newLoc + fname + '" already exists')

            if not os.path.isfile(newLoc): #if the file doesnt exist then copy it and print out confirmation that is was copied/moved
                try:
                    shutil.move(oldLoc, newLoc)
                    print('File ' + fname + ' copied.')
                    count = count + 1
                except IOError:
                    print('There was an error copying the file:  "' + fname + '"')
                    print 'error'            

print "\n"
print str(count) + " files were moved."
print "\n"

フォルダ構造が次のような場合:

root->
 band 1->
  album name->
   song.m4a,
   song2.m4a

現在、コピーする .mp3 ファイルがなくても、コピー先のディレクトリにこれらすべてのフォルダーが作成されます.....

どんな助けでも大歓迎です!

4

3 に答える 3

1

私はこの種のもののためにコピーの周りに私自身のラッパーを作成すると思います:

def fcopy(src,dest):
    """
    Copy file from source to dest.  dest can include an absolute or relative path
    If the path doesn't exist, it gets created
    """
    dest_dir = os.path.dirname(dest)
    try:
        os.makedirs(dest_dir)
    except os.error as e:
        pass #Assume it exists.  This could fail if you don't have permissions, etc...
    shutil.copy(src,dest)

これで、任意のファイルでこの関数を呼び出すツリーをたどることができ.mp3ます。

于 2013-02-15T03:22:39.177 に答える
0

shutils.copytreeより少ない行数でやりたいことをやりませんか?

于 2013-02-15T03:18:47.637 に答える
0

既存のコードに対して私が考えることができる最も簡単なことは、.mp3 ファイルが含まれていないフォルダーをスキップすることです。ifこれは、次の項目とステートメントをループの先頭に追加することで簡単に実行できます。itertools.ifilter()関数とfnmatch.fnmatch()関数を一緒に使用して、適切な拡張子を持つファイルのチェックを簡素化できます。

from itertools import ifilter
from fnmatch import fnmatch

ext = '.mp3'
fnPattern = '*'+ext

for dirName, subdirList, fileList in os.walk(source_dir):
    if not any(ifilter(lambda fname: fnmatch(fname, fnPattern), fileList)):
        print '  skipping "{}"'.format(dirName)
        continue
    ...

また、宛先ディレクトリの対応するサブブランチにファイルをコピーする必要がある場合に、以前の反復でスキップされたサブディレクトリが作成されるように、コードのさらに下の toos.mkdir(dest)を変更する必要があります。os.makedirs(dest)

拡張子を持つ一致するファイルの空のイテレータを作成して保存し、後でそれを使用してコピーするファイルを決定することで、少し最適化できます。

from itertools import ifilter
from fnmatch import fnmatch

ext = '.mp3'
fnPattern = '*'+ext

for dirName, subdirList, fileList in os.walk(source_dir):

    # generate list of files in directory with desired extension
    matches = ifilter(lambda fname: fnmatch(fname, fnPattern), fileList)

    # skip subdirectory if it does not contain any files of interest
    if not matches:
        continue
    ...
    ... create destination directory with os.makedirs()
    ...
    #  copy each file to destination directory
    for fname in matches:
      ... copy file
于 2013-02-15T04:55:36.807 に答える