使用搜索来获取匹配的文件列表

时间:2014-08-26 18:50:56

标签: python

我正在使用类的以下函数来查明每个.csv是否在给定目录中具有相应的.csv.meta。 对于只有.csv的文件和.csv.meta的十六进制代码,我得到“无”。

Result
None
<_sre.SRE_Match object at 0x1bb4300>
None 
<_sre.SRE_Match object at 0xbd6378>

这是代码

def validate_files(self,filelist):
    try:
       local_meta_file_list = []
       local_csv_file_list = []

    # Validate each files and see if they are pairing properly based on the pattern *.csv and *.csv.meta
       for tmp_file_str in filelist:
           csv_match = re.search(self.vprefix_pattern + '([0-9]+)' + self.vcsv_file_postfix_pattern + '$' , tmp_file_str)
           if csv_match:
              local_csv_file_list.append(csv_match.group())
              meta_file_match_pattern=self.vprefix_pattern + csv_match.group(1) + self.vmeta_file_postfix_pattern
              tmp_meta_file = [os.path.basename(s) for s in filelist if meta_file_match_pattern in s]
              local_meta_file_list.extend(tmp_meta_file)
    except Exception, e:
       print e
       self.m_logger.error("Error: Validate File Process thrown exception " + str(e))
       sys.exit(1)

    return local_csv_file_list, local_meta_file_list

这些是文件名。

  File Names 
rp_package.1406728501.csv.meta
rp_package.1406728501.csv
rp_package.1402573701.csv.meta
rp_package.1402573701.csv
rp_package.1428870707.csv
rp_package.1428870707.meta

由于 沙

1 个答案:

答案 0 :(得分:0)

如果您只需查找具有相应.csv个文件的.csv.meta个文件,那么我认为您不需要使用正则表达式来过滤它们。我们可以为具有.csv扩展名的人筛选文件列表,然后针对名称加.meta的文件在文件列表中显示的文件进一步过滤该列表。

这是一个简单的例子:

myList = [
    'rp_package.1406728501.csv.meta',
    'rp_package.1406728501.csv',
    'rp_package.1402573701.csv.meta',
    'rp_package.1402573701.csv',
    'rp_package.1428870707.csv',
    'rp_package.1428870707.meta',
]

def validate_files(file_list):
    loc_csv_list  = filter(lambda x: x[-3:].lower() == 'csv', file_list)
    loc_meta_list = filter(lambda c: '%s.meta' % c in file_list, loc_csv_list)
    return loc_csv_list, loc_meta_list

print validate_files(myList)

如果可能存在不符合rp_package格式且需要排除的CSV文件,那么我们最初可以使用正则表达式过滤文件列表。这是一个例子(根据需要交换正则表达式参数):

import re

vprefix_pattern           = 'rp_package.'
vcsv_file_postfix_pattern = '.csv'
regex_str                 = vprefix_pattern + '[0-9]+' + vcsv_file_postfix_pattern

def validate_files(file_list):
    csv_list      = filter(lambda x: re.search(regex_str, x), file_list)
    loc_csv_list  = filter(lambda x: x[-3:].lower() == 'csv', csv_list)
    loc_meta_list = filter(lambda c: '%s.meta' % c in file_list, loc_csv_list)
    return loc_csv_list, loc_meta_list

print validate_files(myList)
相关问题