2017-06-29 7 views
1

ディレクトリ内の最新のzipファイルを見つけるこのコードがあります。このプログラムは、いくつかのフォルダでかなり高速に動作しますが、調べる必要のある789個のフォルダ、zipファイルがあるフォルダなど、多くのフォルダがあり、コードは出力を生成するのに30分以上かかります。どのように私はこのコードをより速く動かすことができるかについてのヒント?実行に時間がかかるディレクトリの最新ファイルを取得

import os, glob 

cwd = os.getcwd() 

list_of_latest = [] 
for (dirname, dirs, files) in os.walk(cwd): 
    for filename in files: 
     if filename.endswith('.zip'): 
      list_of_files = glob.glob(dirname + '\*.zip') 
      latest_file = max(list_of_files, key=os.path.getctime) 
      if latest_file not in list_of_latest: 
       list_of_latest.append(latest_file) 

for i in list_of_latest: 
    print i 

ありがとうございます!

+0

おそらくあなたはこれを並列に行うためのプロセスを引き起こす可能性がありますが、私はそれが30分から数秒になることはわかりません。 – PYA

答えて

2

これは実現していないかもしれませんが、コードに冗長なループがあります。ここでは、コードのこの作品:

for filename in files: 
    if filename.endswith('.zip'): 
     list_of_files = glob.glob(dirname + '\*.zip') 

glob.globは、ルートパスですdirnameで指定された現在のディレクトリ(にすべて zipファイルを取得します、あなたがそのディレクトリ内の10個のzipファイルがある場合さて、あなたは意志。 glob.glob 10回を実行し、それぞれの時間は、あなたが同じファイルを見つけしかし、それは、最初のリストに追加された全体の内部ループはこのような何かを簡素化することができる

:!。。

for (dirname, dirs, files) in os.walk(cwd): 
    list_of_files = glob.glob(dirname + '\*.zip') 
    if len(list_of_files) == 0: 
     continue 
    latest_file = max(list_of_files, key=os.path.getctime) 

    if latest_file not in list_of_latest: 
     list_of_latest.append(latest_file) 

その内側のループは不要です。あなたは二回ディレクトリ内のすべてのファイルを反復処理している

+0

私はこれを試しました。それは私にvalueErrorを与えています:max()argは空のシーケンスです。 @Coldspeed – LearningEveryday

+0

@JeanPaulMugisha今すぐお試しください。 ifチェックを追加しました。 –

+0

これで動作します。ありがとう!!!! – LearningEveryday

1

- 一度で:

for filename in files: 

、その後:あなたはおそらく欲しい

latest_file = max(list_of_files, key=os.path.getctime) 

は次のとおりです。

for (dirname, dirs, files) in os.walk(cwd): 
    list_of_files = glob.glob(dirname + '\*.zip') 
    latest_file = max(list_of_files, key=os.path.getctime) 
    if latest_file not in list_of_latest: 
     list_of_latest.append(latest_file) 

ああ、のリストの代わりにセットを使用した場合それ以上の簡素化を可能にします:

list_of_latest = set() 
for (dirname, dirs, files) in os.walk(cwd): 
    list_of_files = glob.glob(dirname + '\*.zip') 
    latest_file = max(list_of_files, key=os.path.getctime) 
    list_of_latest.add(latest_file) 
+0

私はこれを試したが、ValueErrorを投げている:max()argは空のシーケンスである@Blotosmetek – LearningEveryday

関連する問題