如何在python中访问目录中的最后一个文件名

时间:2019-01-31 13:40:50

标签: python python-3.x python-os fileparsing

我正在尝试遍历目录中的某些文件。如果文件名包含两个特定的字符串,那么我应该打开并读取这些文件以获取信息。但是,如果所有文件都没有这两个字符串,那么我只想打印一次错误消息。

for filename in os.listdir(directory):
   if filename.find("<string1>") != -1 and filename.find("<string2>") != -1:
      #open file
   else:
      #print error message

我知道这样做会打印与目录中文件数量一样多的错误消息(即,如果有15个不匹配的文件,我会得到15条错误消息)。但是我想要的是在目录中的N个文件中没有任何匹配项之后仅打印一次错误消息。我想我可以做这样的事情:

for filename in os.listdir(directory):
   if filename.find("<string1>") != -1 and filename.find("<string2>") != -1:
      #open file
   else:
      if filename[-1]: #if filename is last in directory
         #print error message

但是我发现这行不通。仅在读取了最后一个文件名并且不匹配后,我如何才能显示一条错误消息?

4 个答案:

答案 0 :(得分:2)

一个简单的解决方案是在for循环之前初始化一些布尔值标志,例如found = false

如果找到文件,请设置found = true。然后,您可以在for循环结束后检查found的值,并根据其值打印适当的消息。

答案 1 :(得分:1)

过滤for循环之前的文件列表:

filenames = [fname for fname in os.listdir(directory) 
             if '<string1>' in fname and '<string2>' in fname]
if filenames:
    for filename in filenames:
        #open file
else:
    #print error message

您可能还可以使用glob模块来获取文件名:

import glob
filenames = glob.glob(directory + '/*string1*string2*')

答案 2 :(得分:0)

另一种方法是使用变量检查是否已处理所有文件。检查并发现它可以在Python 2.7中工作

import os

directory = "E:\\test\\"
files_count = len(os.listdir(directory))
files_processed = 0
for filename in os.listdir(directory):
   if 'string1' in filename and 'string2' in filename:
      #open file
      print ("Opening file")
   else:
    files_processed = files_processed + 1
    if (files_processed >= files_count):
        print ("error message")

答案 3 :(得分:0)

不确定这是否极端。但是我会使其成为一个函数并引发IOError。 另外,我将始终使用绝对路径。也尝试pathlib模块

import os

def get_files(directory):
    for filename in os.listdir(directory):
        if "string1" in filename and "string2" in filename:
             yield filename
    raise IOError("No such file")

for file in get_files('.'):
    print(file)
    # do stuff with file