2016-10-06 5 views
0

開始フォルダのすべてのディレクトリとサブディレクトリを再帰的に処理するスクリプトを作成していますが、メモリエラーが発生しています(エラーはMemoryErrorです)。私の推測はおそらく私のdata_dictsリストが大きすぎますが、わかりません。アドバイスをいただければ幸いです。Python - ファイル情報を収集すると再帰的にメモリエラーが発生する

import os 

# example data dictionary 
data_dict = { 
    'filename': 'data.csv', 
    'folder': 'R:/', 
    'size':  300000 
} 

def get_file_sizes_folder(data_dicts, starting_folder): 
# Given a list of file information dictionaries and a folder, iterate over the files 
# in the folder to get their information and append it to the list. 
# Also recurse through subdirectories 
    for entry in os.scandir(starting_folder): 
     if not entry.name.startswith('.'): 
      if entry.is_file(): 
       size = entry.stat().st_size 
       filename = entry.name 
       folder = os.path.dirname(entry.path) 
       temp_dict = {'filename': filename, 'size': size, 'folder': folder} 
       data_dicts.append(temp_dict.copy()) 
      else: 
       print(entry.path) 
       data_dicts.extend(get_file_sizes_folder(data_dicts, entry.path)) 

    return data_dicts 

d = get_file_sizes_folder([], 'R:/')  
+0

os.walk

例を使用しますか? – MariusSiuram

答えて

3

あなたはあなたの関数get_file_sizes_folder()の引数としてdata_dictsを提供するべきではありません。そうすることで、おそらくほぼ階乗的な率で、あなたのエントリーがたくさん複製されます。あなたのコンピュータが非常に速くメモリ不足になるのは当然のことです。

は代わりに、引数としてのみstarting_folderを使用して、単純にそのように、あなたの関数の最初の行に新しいリストを作成data_dicts

def get_file_sizes_folder(starting_folder): 
# Given a list of file information dictionaries and a folder, iterate over the files 
# in the folder to get their information and append it to the list. 
# Also recurse through subdirectories 
    data_dicts = [] 
    for entry in os.scandir(starting_folder): 
     if not entry.name.startswith('.'): 
      if entry.is_file(): 
       size = entry.stat().st_size 
       filename = entry.name 
       folder = os.path.dirname(entry.path) 
       temp_dict = {'filename': filename, 'size': size, 'folder': folder} 
       data_dicts.append(temp_dict) 
      else: 
       print(entry.path) 
       data_dicts.extend(get_file_sizes_folder(entry.path)) 

    return data_dicts 
1

あなたはすべての再帰を行うべきではありません。あなたは[ `os.walk`](https://docs.python.org/2.7/library/os.html#os.walk)を使用していない理由を

def get_file_sizes_folder(starting_folder): 
    data_dicts = list() 
    for root, _, files in os.walk(starting_folder): 
     data_dicts.extend({ 
      'filename': f, 
      'size': os.path.getsize(os.path.join(root, f)), 
      'folder': root, 
     } for f in files) 

    return data_dicts 

d = get_file_sizes_folder('R:/') 
+0

ありがとうございます。私はいくつかの質問があります。あなたはパラメータとして '_'をリストしていますが、私はそれを使ってあなたに会いません。また、何らかのリストの理解を使用していることに気がついていますが、大文字と小文字の区別はありません。これを説明していただけますか? – N4v

+0

'_'は、私がコマンドの' folders'パラメータを必要としないためです。望ましくない/未使用のパラメータにはアンダースコアを使用するのが一般的です。リスト内包はリスト内包ではなく、ジェネレータ式です。私はあなたがそれをテストし、その行動が期待されるものであることを確認することを勧めます。 – MariusSiuram

関連する問題