2016-12-30 105 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+name替換爲os.path.join(root, name)root元素是path下子目錄的實際包含name的路徑,您目前從完整路徑中省略該路徑。

如果您希望保留目標中的目錄結構,您還應該用os.path.join(dest, os.path.relpath(root, path))替換destos.path.relpathroot減去path的路徑前綴,允許您在dest下創建相同的相對路徑。如果不存在正確的子文件夾,您可能需要調用os.mkdir或對他們更好,但os.makedirs,當您去:

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,至極確實非常相似,你想要什麼東西。唯一的缺點是它不能提供像過濾那樣的東西(你正在使用的)的控制水平。