2016-07-29 11 views
0

私は目的のために以下のファイルを含む1つのディレクトリを持っています。ここで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 

がどのように私は「AM_INMAG_Export_」」で始まるファイルを検索することができ、それがPythonの例えば を使用して、最新のタイムスタンプを持つ必要があります。 『AM_INMAG_Export_2016-07-29.csvは』私がしたいファイルがあります取得。 しかし "fileNは" ディレクトリ内の最新の変更されたファイルである。

答えて

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' 
+0

"AM_INMAG_Export_2016-07-29.csv"ファイルが存在しない場合、 "AM_INMAG_Export_2016-07-28_done.csv"を与えてはいけません。 –

+0

@ThejeshPR:オリジナルの質問はこの区別をしません。 '' AM_INMAG_Export_ "で始まるファイルを取得すると言うだけです。 – MattH

+0

はい、そうです.x.endswith( '_ done.csv')ではなく、x.startswith( 'AM_INMAG_Export_')を使って実行できます。 –

0

使用glob.glob

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

これは、名前に定義された時間が実際に更新された時間である場合に機能します。そうしないと、あなたは

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')) 
+0

ファイルを変更したときからではなく、最新のファイルをファイル名から取得する必要があることを明示しています。 –

+0

さて、彼はそれを明示的に言っていません** :-)彼が与えた例から、あなたは両方の場合を終えることができます。 – napuzba

0

を見つけるためにos.statを使用する必要があるので、あなたはグループ項目として日付を取得するために正規表現を使用する必要があるように見えます。すべてのグループを取得したら、それをPythonの日付に変換して、どれが最も日付が高いかを確認する必要があります。

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

これは、あなたがグループを中心に、より詳細に行くと、あなたが探している実際の日付フォーマットを取得することができ、使用することになるだろう正規表現です。

1
files = glob.glob('AM_INMAG_Export_*.csv') 
sorted_files = sorted(files, key=lambda x: int(x.split('_')[3].split('.')[0])) 
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 

注:ここでの仮定は、すべてのファイルが同じでなければならないことです接頭辞とポストフィックスの違いは、日付によるものです。

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() 
関連する問題