从Python中的一小部分可能的文件名中确定正确文件名的好方法

2024-04-24 17:09:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python项目,用于计算集群的slurm队列管理器。我可以做的一件事是在文本窗口中打印特定作业的特定文件的内容。你知道吗

但是,人们用于同一类型文件的扩展名有时会发生变化。我可以对它进行编程,使它对我有效,但我也希望能够查找其他人的文件。你知道吗

我解决这个问题的方法如下

extensions = [".ex1", ".ext2", "ext3"]
for ext in extensions:
    try:
        f = open(jobname+ext), "r")
        content = f.read()
        f.close()

        <doing some stuff with content>

    except IOError:
        if ext == extensions[-1]:
            print("File not found")
            return

如果实际使用的扩展被extensions覆盖,那么我的代码将找到它。我想知道更有经验的程序员是否有更好/更优雅/更高效的方法。幸运的是,要读取的文件非常小,所以遍历所有的可能性不会花费太多时间。但这种特殊的解决方案可能不适用于其他情况。你知道吗


Tags: 文件项目方法文本类型内容管理器队列
3条回答

您可以使用^{}语句打开一个文件,然后让它自动关闭。此外,您还可以将mode参数省略为open()(默认为'r'),并可能在找到有效扩展名后添加break

extensions = [".ex1", ".ext2", "ext3"]
for ext in extensions:
    try:
        with open(jobname+ext)) as f:
            content = f.read()            

        # do some stuff with content
        break    
    except IOError:
        if ext == extensions[-1]:
            print("File not found")
            return

据我所知,您已经知道文件名和路径,只有扩展名是未知的。 使用glob包查找具有该名称的所有文件,如下所示:

from glob import glob

matches = glob("/path/to/files/knownfilename.*")
if not matches:
    print("File not found!")
    return
try:
    with open(matches[0], "r") as f:
        content = f.read()
    # do stuff
except IOError:
    print("Error reading file {}".format(matches[0]))

在这种情况下,你可能要处理

  • 有多个文件具有该名称和不同的扩展名
  • matches列表中的第一个文件不是您想要的文件类型(可能是扩展名为.bak的备份文件或其他文件),因此您可能还希望将一些扩展名列入黑名单

您可以使用os.listdir('.')获取当前工作目录中的文件名列表,使用for循环遍历该列表,并从jobname长度中分割文件名,然后使用in操作符测试它是否是extensions列表/元组中的扩展名之一。break在处理文件之后,当找到具有所需名称的文件时。如果循环完成而没有中断,则使用elsefor循环打印File not found消息:

import os
extensions = '.ext1', '.ext2', '.ext3'
for filename in os.listdir('.'):
    if filename.startswith(jobname) and filename[len(jobname):] in extensions:
        with open(filename) as f:
            content = f.read()
            # doing some stuff with content
        break
else:
    print("File not found")

相关问题 更多 >