使用fnmatch匹配文件名的两个部分

1 投票
1 回答
1088 浏览
提问于 2025-04-19 20:07

我现在正在使用 fnmatch 来找到我想复制的文件,同时忽略其他文件。

下面是我脚本的一部分,给大家举个例子,看看我是怎么用的。

pattern = "*.xlsx"

if fnmatch(name, pattern):
    source_files.append(os.path.join(path, name))

我发现这个方法现在也匹配到了隐藏文件,而我并不想复制这些文件。

我想到了解决这个问题的三种方法:

  1. 我可以完全排除隐藏文件。
  2. 我可以排除那些以 ~$ 开头的文件。
  3. 或者我可以只选择那些以 Update 开头并且以 .xlsx 结尾的文件。

我觉得用正则表达式来描述我想复制的文件类型是最简单的,但我不确定 fnmatch 是否支持完整的正则表达式。

你有什么建议吗?

1 个回答

2

使用 fnmatch 的功能可以排除某些字符,具体的说明可以在文档中找到。

In [33]: fnmatch('hello.xlsx', '[!~]*.xlsx')
Out[33]: True

In [34]: fnmatch('~hello.xlsx', '[!~]*.xlsx')
Out[34]: False

至于你问题最后的评论——如果你觉得用正则表达式来描述你的文件是最好的方法,那为什么不把 fnmatch 替换成 re.match(...) is not None 呢?你一定要使用 fnmatch 吗?

撰写回答