2017-07-10 7 views
2

フォルダー内を歩き回り、ファイル拡張子に応じてフォルダーを作成しようとしました。しかし予期せぬ理由から、1つのファイルだけがコピーされ、スクリプトは次のファイルに切り替わります。私はフォルダが適切に作成され、1つのファイルがコピーされるので、ベースが良いと思う。だから、なぜ他のすべてがコピーされていないのですか?フォルダーの作成後にすべてのファイルがコピーされない理由

誰かがなぜそれを理解するのを助けることができますか?

import os 
import shutil 

dir = "/home/user/Documents/utils/testFindAndCopy" 
target = "/home/user/Documents/utils/result" 

def createDir(target): 
    os.makedirs(str(target)) 

def copyFiles(file, target): 
    shutil.copy2(file, target) 


for subdir, dirs, files in os.walk(dir): 
    for file in files: 
     filepath = subdir + os.sep + file 
     folderName = file.split('.') 
     targetDir = target + '/' + str(folderName[1]) 
     try: 
      if os.path.exists(str(folderName)): 
       print(folderName[1]) 
       print(targetDir) 
       print(filepath) 
       copyFiles(filepath, targetDir) 
      else: 
       createDir(str(targetDir)) 
       copyFiles(filepath, targetDir) 
       print(folderName[1]) 
       print(targetDir) 
       print(filepath) 
     except OSError, e: 
      if e.errno != 17: 
       raise 
       # time.sleep might help here 
      pass 
+0

コピーファイルは、既存のファイルを上書きされる可能性があります。なぜ 'os.rename'を使わないのですか? –

+0

@COLDSPEED source dirにあるすべてのファイルをコピーする必要があります。そしてすべてのファイルは別の名前を持っています – charter77

+0

@COLDSPEED 'os.rename'はbashの' mv'に相当し、ファイルを移動しますか? – cmaher

答えて

1

ここではいくつかのエラーがあります。ファイルとディレクトリの操作は難しく、そのときは非常に注意する必要があります。

os.path.joinを使用してファイルパスを構築する必要があります。

ファイル名を "。"に分割すると、返される値は文字列ではなくリストです。それはあなたの変数folderNameです。うまく選択された名前ではありません。あなたの式os.path.exists(str(folderName))は、常にFalseです。なぜなら、str()関数はリストから単純な文字列を再構成しないからです。

ファイル名には複数のドットを含めることができます。ディレクトリ名にfolderName[1]を使用すると、そのようなファイル名が存在しないと想定しています。 folderName[-1]を使用すると、ファイル名の最後の部分が常に得られます。

すでに存在するディレクトリでmkdir/makedirsを呼び出すと、その時点でOSError例外が発生します。その後、ファイルのコピーは行われません。

シャットダウンしたファイルは、copyFilesという名前のファンクションで呼び出されますが、1つのファイルがコピーされます。

あなたはOSErrorをキャッチしますが、OSErrorが17でなければ何もしません。あなたのスクリプトがエラーをキャッチしているかどうかはわかりません。

あなたはあなたのメインループはこのような何かになりたい:

for subdir, dirs, files in os.walk(dir): 
    for file in files: 
     filepath = os.path.join(subdir, file) 
     folderName = file.split('.') 
     targetDir = os.path.join(target, folderName[-1]) 
     try: 
      print(targetDir, filepath, os.path.exists(targetDir)) 
      if not os.path.exists(targetDir): 
       createDir(targetDir) 
      shutil.copy2(filepath, targetDir) 
+0

答えをありがとう、それは明らかだった。私はすべての点を理解し、私の間違いを理解することは役に立ちます。私はあなたの提案を適用し、それはうまく動作します! ありがとうございました! – charter77

+0

それはあなたのために働いてうれしい。あなたが気にしないなら、答えを受け入れてください。 –

+0

もう一度やり直す – charter77

1

shutil.copytree(src, dst)を使用してください。

これでファイルツリーを移動する必要はありません。トップレベルのディレクトリをソースとして設定するだけです。 docsから

は、再帰的に先のディレクトリを返す、SRCをルートディレクトリツリー全体をコピーします。 dstで指定された宛先ディレクトリは、すでに存在してはいけません。親ディレクトリが見つからないだけでなく作成されます。ディレクトリのパーミッションと時間はcopystat()でコピーされ、個々のファイルはshutil.copy2()でコピーされます。

関連する問題