【问题标题】:Applying multiple filters on files names using glob in Python在 Python 中使用 glob 对文件名应用多个过滤器
【发布时间】:2023-02-23 04:23:46
【问题描述】:

我想使用 python 中的 glob 库对文件名应用多个过滤器。我浏览了一些在线资源,可以看到使用 * 操作,可以这样做。但是,我的过滤器无法正常工作,因为我试图同时应用多个过滤器。它读取的文件多于应有的数量。

假设我的文件存储有如下日期信息。我有年、月、日信息作为扩展。例如,名称my_file_20220101A1835.txt 表明该文件是从 2022 年 1 月 1 日开始的,并在下午 6 点 35 分保存。如果我想获取前六个月上半年的 2022 年到 2023 年之间的所有文件,我将使用以下行。

folder_path = "...'
glob.glob(f"{folder_path }/*[2022-2023]**[01-06]**[01-15]*"A"*[01-24]**[00-60]*.pq")

有没有一种结构化的方法可以有效地执行此操作?

【问题讨论】:

  • 您可以使用 glob 获取所有内容,然后通过正则表达式过滤结果。
  • 这不是 glob 模式擅长的事情。您不能像这样指定字符范围。 [2022-2023]等同于[203][01-15]等同于[015]
  • @Peter 你能举个玩具例子吗?
  • A/B/C 只是单个/常量字符吗?它们在任何方面都有意义,还是只是分隔符(例如:-)?
  • 它们主要是分隔符并且各不相同,但我只对数字感兴趣,因为它们代表年、月等。

标签: python file directory glob


【解决方案1】:

这 ”字符范围“不要按照你认为的方式工作......他们对单个字符进行操作 - 即:[01-06] 将允许任何字符匹配01-06......其中1-0是一个无效(向后)范围。

此外,双星 (**) 仅在某些情况下相关 - 如果 recursive=True 它“将匹配任何文件和零个或多个目录、子目录和目录的符号链接“,如果include_hidden=True它”将匹配隐藏目录“。docs


相反如何 - 因为您对表示的实际日期感兴趣 - 您解析出日期并与之匹配。这提高了您阅读和维护应用程序的能力 - 虽然可以编写正则表达式来匹配此日期,但它很快就会变得难以推理。

import re
from glob import iglob
from datetime import datetime

for fname in iglob('./*.pq'):
  match = re.search(r'/(?P<name>.*)_(?P<date>[0-9]{8}).(?P<ext>[^.]+)$', fname)
  if not match:
    # filename format doesn't match what we're after...
    continue

  try:
    date = datetime.strptime(match.groupdict()['date'], '%Y%m%d')
  exception ValueError:
    # the 8 digits we matched don't look like a date...
    continue

  if not (2022 <= date.year <= 2023):
    continue
  if not (1 <= date.month <= 6):
    continue
  if not (1 <= date.day <= 15):
    continue

  # handle file here!
  print(fname)

【讨论】:

  • 我不喜欢使用datetime,因为我的字符串表示在实际年份和月份之间有字符串字符。另外,我还有小时和分钟信息。我尽力在我的帖子中提供 MWE。带来不便敬请谅解。
  • 因为我的字符串演示文稿在实际年份和月份之间有字符串字符。另外,我还有小时和分钟信息" - 请提供一个complete示例,这很容易处理!
  • 目前,matchiglob 中的每个条目返回None
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多