【问题标题】:Glob fetching pdf files with lower or upper .pdf extensionGlob 获取具有较低或较高 .pdf 扩展名的 pdf 文件
【发布时间】:2020-08-26 05:45:02
【问题描述】:

我有一段代码使用 os.walk 遍历目录,然后在相应的目录中获取那里所有 pdf 文件的文件列表。

为了在遍历后获取特定目录中的 pdf 文件列表,我使用 glob,如下所示:

file_list = glob.glob(os.path.join(root,invoice_dir_name, "*.pdf"))

它获取目录中以 .pdf 结尾的所有文件。

但我刚刚发现了一个极端情况,如果目录有 pdf 文件,但如果它们以 .PDF 结尾,它会返回空字符串,因为它正在寻找小写的 .pdf 扩展名。

如何在 glob 函数中添加正则表达式,以便它可以获取 .pdf 或 .PDF 中的任何一个。我试过了

file_list = glob.glob(os.path.join(root,invoice_dir_name, "*.(pdf|PDF)"))

但显然它不起作用

我的代码使用 glob 和 os.walk 并且要求使用的任何其他东西都将是代码的重做,所以我想知道是否可以使用 glob 找到一个 soln。谢谢

【问题讨论】:

  • 我猜你可以调用 glob 两次,然后将所有结果放入一个列表中然后处理它
  • 那行不通。为主目录中的每个子目录运行 Glob。对于一个子,它可以工作,因为它有 .pdf 文件。其他它没有 .PDF
  • 我想说这和你已经做过的没有什么不同,让我分享一个代码。
  • glob.glob(os.path.join(root,invoice_dir_name, "*.pdf")) 应该适用于两者......我相信glob 模式不区分大小写
  • 在 mac 上也可以;不起作用。 Glob 不区分大小写

标签: python


【解决方案1】:

分别搜索 .pdf & .PDF 并将信息收集到单个列表中如何?这样,为两种模式找到的匹配项将被合并并返回。

def get_files(root, dir_name, pattern):
    patterns = [os.path.join(root, dir_name, pattern.upper()), os.path.join(root, dir_name, pattern.lower())]
    return [filename for p in patterns for filename in glob.glob(p)]

如果不是新函数,则直接替换:

file_list = glob.glob(os.path.join(root,invoice_dir_name, "*.pdf"))

与:

pattern = "*.pdf"
p_lower = os.path.join(root, dir_name, pattern.upper())
p_upper = os.path.join(root, dir_name, pattern.lower())
file_list = [fname for p in (p_lower, p_upper) for fname in glob.glob(p)]

输出:

[
  '/Users/username/docs/37-sbc-sleep-apnea-2018.PDF',
  '/Users/username/docs/notice.pdf',
  '/Users/username/docs/Health2020.pdf',
  '/Users/username/docs/West.pdf',
  '/Users/username/docs/hello-Health-net-excel-file-2020.pdf', 
  '/Users/username/docs/2018-arbitration-form-english.pdf'
]

【讨论】:

  • 这里没有使用其他功能。有没有一种方法可以在不使用其他功能的情况下完成。我尝试使用下面的 os.listdir 而不是下面的 glob: file_list = [os.path.join(root, invoice_dir_name, file_name) for file_name in os.listdir(os.path.join(root,invoice_dir_name))] 问题是如果除了pdf os.listdir 之外还有其他文件,那么我的代码会进一步抛出错误,因为它只需要pdf文件。所以如果上面的os.listdir只能接收pdf文件,那么它也可以工作跨度>
  • 是的,使用 listdir,您需要再次过滤不需要的。让我们不要采取那个方向。而是告诉 glob 同时选择 pdf 和 PDF,这不应该是一个昂贵的操作。
  • 当你加入 p_lower 时,你只是在那里使用 *.pdf 时不起作用。它不会给出文件的全名。我这样做了,它有效。我从 os.listdir file_list = os.listdir(os.path.join(root,invoice_dir_name)) file_list_pdf = [os.path.join(root, invoice_dir_name, file_name) for file_list in file_list 中过滤掉以 .pdf 结尾的文件if file_name.lower().endswith(".pdf")]
  • glob 应该使用模式来匹配但返回文件的绝对路径
  • 你觉得我在 .endswith() 上使用过滤器的 os.listdir 可能有任何问题吗?我认为它应该涵盖所有问题
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多