根据模式识别一组文件和进程:Python

时间:2015-03-30 20:30:12

标签: python regex

我的要求是,如果我在文件名中找到特定模式,那么我需要删除属于该组的相应文件组。例如,下面是我拥有的文件组:

file1.infile_inprogress_2015033
file1.infile_rsn_20150330022431
file1.infile_err_20150330022431
file2.infile_03_29_2015_05:08:46
file2.infile_03_29_2015_05:09:56
file3.infile_20150330023214

我需要在文件名中搜索的模式是:"inprogress"。因此,在上面的列表中,我将需要删除以下文件:

file1.infile_inprogress_2015033
file1.infile_rsn_20150330022431
file1.infile_err_20150330022431

因为上面的列表在标识符"file1"之前具有相同的文件名("infile")。

截至目前,我只能列出文件:

 filelist = (glob.glob('C:\\CIRP\\Velocidata\\Test\\*'))
 for file in filelist:
  filenamecopied = os.path.basename(file)
  if fnmatch.fnmatch(filenamecopied,"*Inprogress*"):
   print ('Delete the group of files ')
  else:
   print ('skip this file')

3 个答案:

答案 0 :(得分:3)

OS walk是一个更好的选择(更容易阅读),然后过滤文件名。

import os
top = 'C:\\CIRP\\Velocidata\\Test\\'

# Getting the list of all files
for root, dirs, files in os.walk(top):

    # Filtering for group names that are 'Inprogress'
    groups_in_progress = []
    for name in files:
        if 'Inprogress' in name:
            group = name[0:name.lower().find('infile')]
            groups_in_progress.append(group.lower())

    # Delete the files where a group is in progress
    for name in files:
        for group in groups_in_progress:
            if name.lower().startswith(group):
                os.remove(os.path.join(root, name))

您可以使用词典和各种优化,但这是最直接的。

答案 1 :(得分:2)

您需要os.unlink。从文档中,os.unlink用于

  

删除(删除)文件路径。

if子句中添加几行

# This if will check for "InProgress"
if fnmatch.fnmatch(filenamecopied,"*Inprogress*"):
    filegroup = filenamecopied.split('.')[0]   # get the file group                                                   
    for i in filelist:                         # Iterate through the files
        # This if will check for "file1" or "file2" etc
        if (i.startswith(filegroup)):          # if i is of same group
             os.unlink(i)                      # Delete it

答案 2 :(得分:1)

几个问题:

  1. 他们是否总是按照您列出的顺序排列,或者可能会弹出 不同的订单?
  2. 他们是否有任何常规格式功能(如前面的filexxx。)?
  3. "进展"零件总是出现在其他文件之前?
  4. 如果我认为文件名格式是一堆字母或数字,那么"。"然后是一堆更多的角色,并且它们以随机顺序出现我会这样做:

    1. 创建一个将要删除的文件前缀列表。
    2. 再次浏览,删除前缀中的文件。
    3. 有点像这样:

      filelist = (glob.glob('C:\\CIRP\\Velocidata\\Test\\*'))
      deleteList = set()
      for f in filelist:
          if "inprogress" in f.lower():     #Checks if inprogress is in the filename
              deleteList.add(f[:f.find(".")])  #Adds base of filename
      print deleteList
      for f in filelist:
          if f[:f.find(".")] in deleteList:
              print "Delete:",f
          else:
              print "Do not delete:",f
      

      我还没有完成实际的删除代码,但您可以检查这是否正在为您捕获所有内容。我使用简单的字符串函数,而不是根据你所说的来捕获文件名。如果没有,请回复上述问题的答案!