【问题标题】:How to access the last filename in a directory in python如何在python中访问目录中的最后一个文件名
【发布时间】:2019-01-31 13:40:50
【问题描述】:

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

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

但我发现这不起作用。仅在读取最后一个文件名并且不匹配后,我将如何获得要打印的错误消息?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我还是个新手,所以我从没想过要这样做。完美运行
    【解决方案2】:

    过滤for-loop之前的文件列表:

    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*')
    

    【讨论】:

      【解决方案3】:

      另一种方法是使用变量来检查是否所有文件都已处理。检查并发现它在 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")
      

      【讨论】:

        【解决方案4】:

        不确定这是否极端。但我会把它变成一个函数并引发 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          • 1970-01-01
          相关资源
          最近更新 更多