Keep latest file and delete all other

前端 未结 5 1730
盖世英雄少女心
盖世英雄少女心 2021-01-16 08:35

In my folder there are many pdf files with date-timestamp format such as shown in the last. I would like to keep the latest file for the day and delete the rest for that day

相关标签:
5条回答
  • 2021-01-16 08:45

    Sort the list and delete files if the next file in the list is on the same day,

    import glob
    import os
    files = glob.glob("*.pdf")
    files.sort()
    
    for ifl, fl in enumerate(files[:-1]):
        if files[ifl+1].startswith(fl[:10]):    #Check if next file is same day
            os.unlink(fl)                       # It is - delete current file
    

    Edit:

    As the OPs question became clearer it became evident that not just the last file of the list is required, but the latest file of each day - to achieve this I included a "same day" conditioned unlinking.

    0 讨论(0)
  • 2021-01-16 08:45

    You could do it that way. The following code is untested, but may work:

    import os
    
    names = os.listdir()
    names.sort()
    for f in names[:-1]:
        os.unlink(f)
    

    Fortunately your file names use ISO8601 date format so the textual sort achieves the desired result with no need to parse the dates.

    0 讨论(0)
  • 2021-01-16 08:51

    The following snippet works with the test case given.

    files = os.listdir(".")
    days = set(fname[8:10] for fname in files)
    
    for d in days:
        f = [i for i in files if i[8:10] == d]
        for x in sorted(f)[:-1]:
            os.remove(x)
    
    0 讨论(0)
  • 2021-01-16 08:55

    Your desired list can also be achieved using groupby .

    from itertools import groupby
    from os import listdir,unlink
    
    filtered_list = list()
    names = os.listdir()
    
    for key,group in groupby(names,lambda x : x[:10]): # groups based on the start 10 characters of file
      filtered_list.append([item for item in group][-1]) #picks the last file from the group
    
    print filtered_list
    
    0 讨论(0)
  • 2021-01-16 09:12

    Using dictionary You can keep one value. This can be dirty and quickest solution, maybe not the best.

    #!/usr/bin/env python
    import os
    import datetime
    import stat
    import shutil
    
    filelist=[]
    lst=[]
    dc={}
    
    os.chdir(".")
    for files in os.listdir("."):
        if files.endswith(".pdf"):
            lst.append(files)
    
    for x in lst:
        print x[0:10].replace("-","")
        dc[int(x[0:10].replace("-",""))]=x
    
    a = dc.items()
    flist=[]
    for k, v in a:
        flist.append(v)
    
    dir="tmpdir"    
    if not os.path.exists(dir):
        os.makedirs(dir)
    
    from shutil import copyfile
    for x in flist:
        print x
        copyfile(x, dir + "/" + x)
    
    #os.chdir(".")
    for files in os.listdir("."):
        if files.endswith(".pdf"):
                os.unlink(files)
    
    os.chdir("./tmpdir")
    for files in os.listdir("."):
        if files.endswith(".pdf"):
            copyfile(files, "../"+files)
    
    os.chdir("../")
    shutil.rmtree(os.path.abspath(".")+"/tmpdir")
    
    0 讨论(0)
提交回复
热议问题