2017-09-19 22 views
0

pythonを初めて使用しました。少し助けていただければ幸いです。 私は10のディレクトリを通過し、各ディレクトリから最新のファイルを1つのフォルダにコピーしたいと思います。各ディレクトリには複数のファイルが存在する可能性があります。Python:複数のディレクトリを検索して最新のファイルを取得し、他のファイルを削除します。

私は各ディレクトリから完全なリストを引き出すことができますが、これをどのように絞り込むかはわかりません。いずれの方向にも感謝します。 STATESディレクトリ内 は、それが役に立つ場合編集**各状態用のディレクトリ(つまりCA、NY、FL、MI、GA)

なり、ディレクトリ構造は次のようになります。 「/ DAT /ユーザー/状態を/ CA /」 '/ DAT /ユーザー/状態/ NY /' '/ DAT /ユーザー/状態/ MI /'

import glob 
import os 

data_dir = '/dat/users/states/*/' 
file_dir_extension = os.path.join(data_dir, '*.csv') 

for file_name in glob.glob(file_dir_extension): 
    if file_name.endswith('.csv'): 
     print (file_name) 
+0

ファイル名の競合を/どのように処理しますか? – MattH

+0

最新のファイルとは何ですか? – PrestonM

+0

削除するファイルはどれですか? – MattH

答えて

1

あなたのすべてのフォルダを横断する代わりにglob.glob()os.walk()を使用することができます。各フォルダごとに、ファイル名のリストが表示されます。これは日付で並べ替えることができますos.path.getmtime()を使用します。これにより、最新のファイルがリストの先頭に表示されます。

リストから最初の要素をポップし、ターゲットフォルダにコピーします。次のようにリスト内の残りの要素は、次にos.remove()を使用して削除することができる:

import os 
import shutil 

root = r'/src/folder/' 
copy_to = r'/copy to/folder' 

for dirpath, dirnames, filenames in os.walk(root): 
    # Filter only csv files 
    files = [file for file in filenames if os.path.splitext(file)[1].lower() == '.csv'] 
    # Sort list by file date 
    files = sorted(files, key=lambda x: os.path.getmtime(os.path.join(dirpath, x)), reverse=True) 

    if files: 
     # Copy the newest file 
     copy_me = files.pop(0) 
     print("Copying '{}'".format(copy_me)) 
     shutil.copyfile(os.path.join(dirpath, copy_me), os.path.join(copy_to, copy_me)) 

     # Remove the remaining files 
     for file in files: 
      src = os.path.join(dirpath, file) 
      print("Removing '{}'".format(src)) 
      #os.remove(src) 

os.path.join()を安全に一緒にパスとファイル名を結合するために使用されます。

注:作成日付/時刻に基づいてソートする

os.stat(os.path.join(dirpath, x)).st_birthtime    

:それはあなたのシステム上でサポートされている場合は、あなたがのようなものを使用する必要があるかもしれません。

+0

これは驚くほど効果的でした!本当にありがとう、これは完璧でした。 – Joey

+0

あなたは大歓迎です!それが助けてくれてうれしい。 –

関連する問題