【问题标题】:Matching file paths regardless of network protocol无论网络协议如何,都匹配文件路径
【发布时间】:2013-07-29 05:53:31
【问题描述】:

我正在开发一个工具,它可以根据几个条件删除网络路径上的文件。我想从检查中排除某些路径,但找不到合适的方法。

程序处理的部分路径如下:

nfs_path = "nfs://Sharepoint/Path/to/Folder/File.ext"
smb_path = "smb://SERVER/Sharepoint/Path/to/Folder/File.ext"
afp_path = "afp://server/Sharepoint/Path/to/Folder/File.ext"
upnp_path = "upnp://277b787b-5b27-b46f-1687-91100ada8d1f/Path/to/Folder/File.ext"

exclusion = "smb://user:pass@server/E/Downloads/Path/to/Folder"

如您所见,一些路径使用凭据,而另一些则不使用。这些网络路径应该能够相互匹配。

简而言之,我想确认File.ext,使用任何协议,是Folder 的一部分(我排除在检查之外)。由于我不是路径操作或正则表达式方面的专家,因此我陷入了困境。我尝试了下面的正则表达式,它对于 NFS 路径失败,因为它也采用共享名称 (E)。 UPnP 路径完全失败,因为它们的性质完全不同。

"(?P<protocol>((smb|nfs|afp|upnp)://((.+:.+@)?.+?/)?))?(?P<directory>.+)"

我也尝试过使用os.path 模块,但方法似乎不合适。

在等待更有效的答案时,我构建了一个正确解析正则表达式,它只会捕获文件夹结构并忽略前缀:

"(?:smb|afp|nfs|upnp)://(?:(?:.+):(?:.+)@)?(?:.+?)/(?P<tail>.*)$"

谁能指出我更有效的方法?我认为这太消耗内存而无法测试很多不同的文件。

它需要在 python 2.6 或更低版本上运行,因为它是现有程序的插件。

【问题讨论】:

  • 为什么在smb甚至本地路径也包含'E'的情况下单独选择NFS作为共享名?它总是有E吗?您能否拆分第一个“E”并将字符串的其余部分作为路径,在开头剥离可选的“:”以说明 local_path?
  • 只有当我使用 NFS 作为正则表达式的输入时,它才会吃掉E。我提到的所有其他路径都可以正常工作,因为正则表达式假定了 NFS 不使用的服务器名称。共享的名称各不相同,文件名也是如此。用户选择要从检查中排除的路径。如果该路径上有文件,则不应删除它们。
  • 你见过os.path.splitunc吗?我不在 Windows 上,所以无法测试。
  • 是的,我有,这些仅适用于格式为 \\Sharepoint\Path\to\Folder\File.ext 的 UNC 路径。所有路径都产生一个空的挂载点,整个路径作为相对路径。
  • 除非有人提出了出色的解决方案,否则我认为最好的办法是提取协议名称(在您的示例中很简单),然后相应地解析字符串的其余部分。

标签: python path pattern-matching network-protocols


【解决方案1】:

如果您的网络和本地目录相同,您可以使用 os.walk(local) 来获取网络目录,只需更改驱动器即可。

import os
networkdir = "Z:\\"
localdir = "C:\\"

for dirs,subdirs,files in os.walk(localdir):
    if os.path.join(localdir,dirs) == excluded:
        continue
    for filename in files:
        localfile = os.path.join(localdir,dirs,filename)
        networkfile = os.path.join(networkdir,dirs,filename)

检查文件是否在被排除的文件夹中:

 excludedpath = "C:\excluded\"
 filename = "file.ext"
 os.path.exists(os.path.join(excludedpath,filename))

【讨论】:

  • 我忘了补充一点,网络路径并不总是作为共享挂载。这是为了创造尽可能多的灵活性。另外,我错误地添加了本地路径和网络路径应该可互换的要求。情况并非如此,我已经更新了问题以反映这一点。只有(未安装的)网络路径,无论是否具有嵌入式凭据,都必须是可互换的。我想这会使您提供的 os.walk 示例无效,对此我很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2021-06-21
  • 2013-12-14
  • 2011-09-26
  • 1970-01-01
  • 2020-03-07
  • 2012-09-26
相关资源
最近更新 更多