2016-10-18 9 views
0

タイトルが示唆しているように、私はpython 3.5で自分のルート( 'C:\') のpdfファイルを検索し、それらのファイルを特定のフォルダに移動したいと考えています。 このタスクは、2: に簡単に分割できます。1. pdf拡張子を持つファイルをmy rootで検索します。 2.特定のフォルダに移動します。すべてのPDFファイルをHDD全体で検索するには?

今すぐ。私は、特定のファイル名を検索する方法を知っていますが、特定の拡張子を持つ複数のファイルは検索しません。

import os 

print('Welcome to the Walker Module.') 
print('find(name, path) or find_all(name, path)') 

def find(name, path): 
for root, dirs, files in os.walk(path): 
    print('Searching for files...') 
    if name in files: 
     return os.path.join(root, name) 

def find_all(name, path): 
result = [] 
for root, dirs, files in os.walk(path): 
    print('Searching for files...') 
    if name in files: 
     result.append(os.path.join(root, name)) 
return result 

この小さなプログラムでは、特定のファイルの1番目またはすべての場所が見つかります。 しかし、私はこれを修正して、一般的なPythonやプログラミングに関する知識が不足しているため、pdfファイルを検索することができません。

ここからどこへ行くべきかについて何らかの洞察があります。

それを合計するには、

  1. は、すべてのPDFファイルのためのルートを検索します。
  2. これらのファイルを特定の場所に移動します。 「G:\ Books」と言うことができます

ありがとうございます。

+0

投稿したコードを書きましたか? – wwii

答えて

0

find_all関数は最終結果に非常に近いです。 ファイルをループすると、os.path.splitextで拡張子を確認できます。もしそれらが.pdfファイルであれば、shutil.moveで移動できます。

ソースディレクトリのツリーを歩く例です、すべてのファイルの拡張子をチェックし、一致した場合には、先のディレクトリにファイルを移動します。あなたは以降のpython 3.5からglobを使用することができます

import os 
import shutil 


def move_all_ext(extension, source_root, dest_dir): 
    # Recursively walk source_root 
    for (dirpath, dirnames, filenames) in os.walk(source_root): 
     # Loop through the files in current dirpath 
     for filename in filenames: 
      # Check file extension 
      if os.path.splitext(filename)[-1] == extension: 
       # Move file 
       shutil.move(os.path.join(dirpath, filename), os.path.join(dest_dir, filename)) 


# Move all pdf files from C:\ to G:\Books 
move_all_ext(".pdf", "C:\\", "G:\\Books") 
+0

ありがとうございます!私はsplittext関数のようなものがあるかどうかを調べるために 'os'モジュールをブラウズしていましたが、私はそれをスキップしていなければなりません。それは今働いている! :) – thelonelytree

1

。再帰的検索をサポートしています。

recursiveがtrueの場合、パターン "**"は任意のファイルと0個以上のディレクトリとサブディレクトリと一致します。パターンの後にos.sepが続く場合、ディレクトリとサブディレクトリのみが一致します。

したがって、あなたは、文字列の論争の最小で

import glob 
from os import path 
import shutil 

def searchandmove(wild, srcpath, destpath): 

    search = path.join(srcpath,'**', wild) 

    for fpath in glob.iglob(search, recursive=True): 
     print(fpath) 
     dest = path.join(destpath, path.basename(fpath)) 
     shutil.move(fpath, dest) 

searchandmove('*.pdf', 'C:\\', 'G:\\Books') 

のようにそれを使用することができます。しかし、ファイルシステムのルートなどの大規模な検索では、しばらく時間がかかることがありますが、どのような方法でもこの問題が発生することは確かです。

Linuxでのみテストされていますが、ウィンドウで正常に動作するはずです。 destpathとして渡すものは、すでに存在している必要があります。

関連する問題