2017-11-03 5 views
2

pythonでディレクトリに保存されている最新の 'apple'、 'pear'などの.csvを抽出しようとしています。新しいファイルは同じプレフィックスで保存されますが、頻度は異なります(apple_getsは5日ごとに更新されます)。 latestfile = max(filenames, key=os.path.getctime)ではなくカテゴリ.startwithのようなものを探していますか?私は数ヶ月前に保存されていたにもかかわらず1つしかないならば、唯一のmelon_ csvを引っ張っていきます。dirから最新のファイルを取得する

""" 
fileDir contains csv files such as: 

pear_20171102_report2.csv 
apple_20171027_report2.csv 
orange_20171101_report2.csv 
kiwi 20171102 report2.csv 
pear_20171101_report2.csv 
cherry 20171101 report2.csv 
kiwi 20171101 report2.csv 
cherry 20171031_report2.csv 
mango 20171001 report2.csv 
apple_20171101_report2.csv 
apple_20171102_report2.csv 
... 
""" 

import glob 
import os 
import re 

fileDir = r'\\ac2knyc05\TestData/' 

filenames = glob.glob(fileDir+'*') 
regex = re.compile(r'\d{8}') 
dates = [] 
prefix = [] 

for filename in filenames: 
    try: 
     date = regex.search(filename).group() 
     dates.append(date) 
     prefix.append(filename.split(date)[0]) 

    except AttributeError: 
     print(filename) 

latestfile = max(filenames, key=os.path.getctime) 

print(set(prefix)) 

ここでは、どのように進むのかわからない、おそらくパンダですか?

+0

は、これらのファイル名は別のファイル内に配置されます:あなたはforループで単一のパスでこれを得ることができますか?あなたは何を求めているのかをより具体的にする必要があります。 –

+0

入力と予想される出力は何ですか?あなたが何を望んでいるのかわからない。 –

答えて

1

パンダを必要としません。あなたは、単にリストの辞書にそれらのファイル名を入れることができます:

filenames = """pear_20171102_report2.csv 
apple_20171027_report2.csv 
orange_20171101_report2.csv 
kiwi 20171102 report2.csv 
pear_20171101_report2.csv 
cherry 20171101 report2.csv 
kiwi 20171101 report2.csv 
cherry 20171031_report2.csv 
mango 20171001 report2.csv 
apple_20171101_report2.csv 
apple_20171102_report2.csv""" 

categories = {} 
for filename in filenames.split("\n"): 
    start_with = filename.split(' ')[0].split('_')[0] 
    categories.setdefault(start_with, []).append(filename) 

print(categories) 
# {'pear': ['pear_20171102_report2.csv', 'pear_20171101_report2.csv'], 'apple': ['apple_20171027_report2.csv', 'apple_20171101_report2.csv', 'apple_20171102_report2.csv'], 'orange': ['orange_20171101_report2.csv'], 'kiwi': ['kiwi 20171102 report2.csv', 'kiwi 20171101 report2.csv'], 'cherry': ['cherry 20171101 report2.csv', 'cherry 20171031_report2.csv'], 'mango': ['mango 20171001 report2.csv']} 

各カテゴリについて、あなたは今、あなたがctimeで並べ替えることができますリストを持っています。

+0

@Vrun:そうだね。ありがとう。 –

+0

ありがとう。 globからの私のファイル名があなたが文字列に割り当てている間のパスのリストであるので、filenames.split( "\ n"):は動作していないようです。 – Vrun

+0

@Vrun:実際、これは、ファイル名の初期化方法の例です偽のディレクトリを作成する必要があります。 –

2

パンダのための必要はありません、あなたはitertools groupbyを使用することができます。

from itertools import groupby 

def key(filename): 
    return filename.replace(" ", "_").split("_")[0] 

{k: max(g, key=os.path.getctime) 
    for k, g in groupby(sorted(filenames, key=key), key)} 

あなたに最新のファイルへのカテゴリの辞書を取得しながら。


注:

res = {} 
for f in filenames: 
    k, t = key(f), os.path.getctime(f) 
    if k not in res: 
     res[k] = f, t 
    else: 
     _, t_ = res[k] 
     if t > t_: 
      res[k] = f, t 

[f for f, _ in res.values()] # list of the latest file for each category 
+1

@EricDuminil良い点、また、一回のパスで行う方法を追加しました。 –

関連する問題