无法使用os.walk解析路径

时间:2016-12-30 21:46:16

标签: python

我有一些代码可以搜索网络共享中与某个关键字匹配的文件。找到匹配项后,我想将找到的文件复制到网络上的其他位置。我得到的错误如下:

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。正在访问的用户文件夹是隐藏的,因此是$。

1 个答案:

答案 0 :(得分:3)

查看os.walk的文档,您的错误很可能是您没有包含完整路径。为避免担心拖尾斜杠和OS /特定路径分隔符等问题,您还应考虑使用os.path.join

path+name替换为os.path.join(root, name)root元素是实际包含path的{​​{1}}下的子目录的路径,您目前正在从完整路径中省略该路径。

如果您希望保留目标中的目录结构,还应将name替换为destos.path.relpathos.path.join(dest, os.path.relpath(root, path))中减去path的路径前缀,允许您在root下创建相同的相对路径。如果不存在正确的子文件夹,您可能需要随时调用os.mkdir或更好os.makedirs

dest

最后,看看shutil.copytree,它会做一些与你想要的非常相似的事情。唯一的缺点是,它不能提供对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) 所做的过滤(你正在使用的)的精细控制。