9

私はPythonを使用しており、すべてのドライブでファイルを検索する関数またはライブラリが必要ですF3。Windowsの場合と同様に、コンピューターのすべてのフォルダーを検索するファイルの名前を指定します。Windows OS、ローカルドライブ、、コードを書く

import os
import win32api
paths = 'D:/'
def dir_list_folder(paths):
    for folderName in os.listdir(paths):
        if (folderName.find('.') == -1):
            folderPath = os.path.join(paths,folderName );
            dir_list_folder(folderPath);
        else:
            print ('Files is :'+ folderName );

良い結果が得られますが、.Zipまたは.RARファイルで検索する必要がない場合は、エラーが発生します。

4

3 に答える 3

10

os.walkWindowsでは、この関数を使用したほうがよいでしょう。os.walkソースツリーを再帰的にウォークするジェネレータを返します。以下のサンプルは、正規表現検索を示しています。

import os
import re
import win32api

def find_file(root_folder, rex):
    for root,dirs,files in os.walk(root_folder):
        for f in files:
            result = rex.search(f)
            if result:
                print os.path.join(root, f)
                break # if you want to find only one

def find_file_in_all_drives(file_name):
    #create a regular expression for the file
    rex = re.compile(file_name)
    for drive in win32api.GetLogicalDriveStrings().split('\000')[:-1]:
        find_file( drive, rex )


find_file_in_all_drives( 'myfile\.doc' )

いくつかのメモ:

  1. ファイルの検索に正規表現を使用しています。このために、私は事前にREをコンパイルしてから、それを引数として渡します。特にファイル名が悪意のあるユーザーからのものである場合は、式を正規化することを忘れないでください。
  2. win32api.GetLogicalDriveStringsすべてのドライバーが0で区切られた文字列を返します。それを分割してから、最後の要素を切り取ります。
  3. ウォーク中に、「。git」や「.cvs」などの「dirs」から不要なフォルダを削除できます。os.walk.__doc__たとえば、を参照してください。
  4. サンプルを短くするために、「found」を伝播しませんでした。すべてのファイルを印刷する場合は、を削除しbreakます。最初のファイルが見つかった後に停止する場合breakは、に伝播します。find_file_in_all_drives
于 2012-10-25T11:55:56.953 に答える
2
import os
az = lambda: (chr(i)+":\\" for i in range(ord("A"), ord("Z") + 1))
for drv in az():
    for root, dirs, files in os.walk(drv):
        process_the_stuff()
于 2012-10-25T11:43:14.970 に答える
1

たとえば、c ドライブのドライブを指定する必要があります。

def findall(directory):
    files=os.listdir(directory)
    for fl in files:
        path=os.path.join(directory,fl)
        if os.path.isdir(path):
            findall(path)
        else:
            dosomethingwithfile(path)
    return

基本的に、ファイル ツリーをトラバースします。ただし、ルートディレクトリとしてドライブをこのメソッドに渡す必要があります。例えば。findall('c:/')

于 2012-10-25T11:39:10.550 に答える