Python正则表达式,用于查找目录中的最新文件

时间:2016-07-29 08:35:57

标签: python

我有一个目录,其中包含以下文件,例如用途。

Directory:
ERROR_AM_INMAG_Export_2016-07-25.csv
AM_INMAG_Export_2016-07-26_done.csv 
ERROR_AM_INMAG_Export_2016-07-27.csv
AM_INMAG_Export_2016-07-28_done.csv 
AM_INMAG_Export_2016-07-29.csv
file1
file2
fileN

在这里我如何检索以""&_ 34; AM_INMAG_Export _"开头的文件?它应该有使用 Python 的最新时间戳。 例如:" AM_INMAG_Export_2016-07-29.csv"是我想要检索的文件。 但" fileN"是目录中最新修改的文​​件。

6 个答案:

答案 0 :(得分:1)

files = glob.glob('AM_INMAG_Export_*.csv')
sorted_files = sorted(files, key=lambda x: int(x.split('_')[3].split('.')[0]))

答案 1 :(得分:0)

使用glob.glob

import glob
print( glob.glob('AM_INMAG_Export_????-??-??.csv')[-1] )

如果名称中定义的时间实际上是更新时间,则此方法有效。否则,您应该使用os.stat来查找

import glob
import os

def find_last_updated(pattern):
    def find_updated(ff):
        return os.stat(ff).st_mtime

    last = None 
    last_updated = 0
    for ff in glob.glob(pattern):
        ff_updated = find_updated(ff)
        if last == None or ff_updated > last_updated :
            last = ff
            last_updated = ff_updated
    return last

print(find_last_updated('AM_INMAG_Export-????-??-??.csv'))

答案 2 :(得分:0)

因此,您需要使用正则表达式将日期作为组项目。一旦你拥有了所有的组,你需要将它转换为python日期,然后检查哪一组具有最大的日期。

import re
pat = re.compile("^AM_INMAG_Export_(.+)\.csv$")
matches = pat.match(your_data)

这是您将要使用的正则表达式,您可以详细了解分组并获得您正在寻找的实际日期格式。

答案 3 :(得分:0)

过滤与所需前缀匹配的文件,然后排序。

>>> files = """ERROR_AM_INMAG_Export_2016-07-25.csv
... AM_INMAG_Export_2016-07-26_done.csv
... ERROR_AM_INMAG_Export_2016-07-27.csv
... AM_INMAG_Export_2016-07-28_done.csv
... AM_INMAG_Export_2016-07-29.csv
... file1
... file2
... fileN""".split('\n')
>>> files
['ERROR_AM_INMAG_Export_2016-07-25.csv', 'AM_INMAG_Export_2016-07-26_done.csv ', 'ERROR_AM_INMAG_Export_2016-07-27.csv', 'AM_INMAG_Export_2016-07-28_done.csv ', 'AM_INMAG_Export_2016-07-29.csv', 'file1', 'file2', 'fileN']
>>> filtered_files = [ x for x in files if x.startswith('AM_INMAG_Export_')]
>>> sorted_files = sorted(filtered_files,reverse=True)
>>> sorted_files[0]
'AM_INMAG_Export_2016-07-29.csv'

<强>更新

使用正则表达式过滤文件名,然后排序。

>>> import re
>>>
>>> files = [
...   'ERROR_AM_INMAG_Export_2016-07-25.csv',
...   'AM_INMAG_Export_2016-07-26_done.csv',
...   'ERROR_AM_INMAG_Export_2016-07-27.csv',
...   'AM_INMAG_Export_2016-07-28_done.csv',
...   'AM_INMAG_Export_2016-07-21.csv',
...   'AM_INMAG_Export_2016-07-25.csv',
...   'AM_INMAG_Export_2016-07-29.csv',
...   'file1',
...   'file2',
...   'fileN'
... ]
>>>
>>> file_re = re.compile(r'^AM_INMAG_Export_\d{4}-\d{2}-\d{2}.csv$')
>>> filtered_files = [ x for x in files if file_re.match(x)]
>>> sorted_files = sorted(filtered_files,reverse=True)
>>> sorted_files[0]
'AM_INMAG_Export_2016-07-29.csv'

答案 4 :(得分:0)

使用glob获取文件,然后将文件名从最早的文件排序到最旧的文件:

files = glob.glob('<YOUR_DIRECTORY>/AM_INMAG_Export_*') # the file prefix + '*' as regex
files.sort(reverse=True) # sort and use 'reverse=True' to get a list of files sorted by the earliest to the oldest
your_precious_file = files[0] # the one with the oldest date

注意:这里的假设是所有文件都有相同的前缀和后期修复,差异是由于日期。

答案 5 :(得分:0)

使用glob.glob()获取的文件列表可以使用sorted语句进行排序。请参阅以下示例

import os
import glob


def main():
    """
    Sort csv Files.
    """
    for f in sorted(glob.glob(os.path.join('AM_INMAG_Export_*.csv')), reverse=True):
        print("File " + f)


if __name__ == "__main__":
    main()