2016-12-30 13 views
1

特定のキーワードと一致するネットワーク共有内のファイルを検索するコードが少しあります。一致するものが見つかったら、見つかったファイルをネットワーク上の別の場所にコピーしたいと思います。os.walkでパスを解決できません

Traceback (most recent call last): 
File "C:/Users/user.name/PycharmProjects/SearchDirectory/Sub-Search.py", line 15, in <module> 
shutil.copy(path+name, dest) 
File "C:\Python27\lib\shutil.py", line 119, in copy 
copyfile(src, dst) 
File "C:\Python27\lib\shutil.py", line 82, in copyfile 
with open(src, 'rb') as fsrc: 
IOError: [Errno 2] No such file or directory: '//server/otheruser$/Document (user).docx' 

私はいくつかのファイルがサブフォルダに発見されたので、私は、その直接のパスを指定せずに見つかったファイルをコピーしようとしているからだと信じて次のように私は取得していますエラーです。もしそうなら、キーワードと一致するファイルへのダイレクトパスをどのように保存できますか?ここに私が今まで持っているコードはあります:

import os 
import shutil 


dest = '//dbserver/user.name$/Reports/User' 
path = '//dbserver/User$/' 

keyword = 'report' 

print 'Starting' 

for root, dirs, files in os.walk(path): 
    for name in files: 
     if keyword in name.lower(): 
     shutil.copy(path+name, dest) 
     print name 

print 'Done' 

PSです。アクセスされているユーザーフォルダは隠されているため、$が表示されます。

+0

私は、この質問をGoogle検索に掲載する可能性が高くなるようにタイトルを編集しました。私はここで特にネットワーク共有は関係ないと思う –

答えて

3

os.walkのドキュメントを見ると、完全なパスが含まれていない可能性が最も高いです。後続のスラッシュやOS /特定のパス区切りなどを気にする必要がないように、os.path.joinの使用を検討する必要があります。

path+nameos.path.join(root, name)に置き換えます。 root要素は、pathというサブディレクトリのパスで実際にはnameが含まれていますが、現在完全パスから省略しています。

宛先にディレクトリ構造を保存する場合は、をos.path.join(dest, os.path.relpath(root, path))に置き換える必要があります。 os.path.relpathは、パスの接頭辞pathrootから差し引くので、同じ相対パスをdestの下に作成することができます。正しいサブフォルダが存在しない場合、あなたはあなたが行くように、まだos.makedirsそれらのos.mkdir以上を呼び出したいことがあります。

for root, dirs, files in os.walk(path): 
    out = os.path.join(dest, os.path.relpath(root, path)) 
    #os.makedirs(out) # You may end up with empty folders if you put this line here 
    for name in files: 
     if keyword in name.lower(): 
     os.makedirs(out) # This guarantees that only folders with at least one file get created 
     shutil.copy(os.path.join(root, name), out) 

は最後に、shutil.copytreeに見て、ウィッヒはあなたが望むものに非常によく似た何かをします。唯一の欠点は、(使用している)os.walkが行うフィルタリングのようなものに対して、きれいなレベルの制御を提供しないことです。

関連する問題