12

I have a set of folders, and I want to be able to run a function that will find the most recently edited file and tell me the name of the file and the folder it is in.

Folder layout:

root
    Folder A
        File A
        File B
    Folder B
        File C
        File D
etc...

Any tips to get me started as i've hit a bit of a wall.

8 Answers 8

23

You should look at the os.walk function, as well as os.stat, which can let you do something like:

import os

max_mtime = 0
for dirname,subdirs,files in os.walk("."):
    for fname in files:
        full_path = os.path.join(dirname, fname)
        mtime = os.stat(full_path).st_mtime
        if mtime > max_mtime:
            max_mtime = mtime
            max_dir = dirname
            max_file = fname

print(max_dir, max_file)
Sign up to request clarification or add additional context in comments.

4 Comments

os.path.getmtime() is a convenient shorthand for os.stat(full_path).st_mtime
I get an error when I run it from my home directory: OSError: [Errno 2] No such file or directory: './.config/chromium/SingletonLock'
@armandino: I'm guessing that the issue is that there's a lock file which is being created and then deleted very rapidly. If it was deleted after os.walk returned its file name, but before the call to os.stat then you would expect to see such an error. If you actually needed to run such a script on directories which have files being deleted in such a manner, I would recommend wrapping the call to os.stat in a try/except block.
Eli, how can i find the last modified file in every subfolder and print it?
11

It helps to wrap the built in directory walking to function that yields only full paths to files. Then you can just take the function that returns all files and pick out the one that has the highest modification time:

import os

def all_files_under(path):
    """Iterates through all files that are under the given path."""
    for cur_path, dirnames, filenames in os.walk(path):
        for filename in filenames:
            yield os.path.join(cur_path, filename)

latest_file = max(all_files_under('root'), key=os.path.getmtime)

1 Comment

Nice tip - this helped me out on a small project I was working on.
8

If anyone is looking for an one line way to do it:

latest_edited_file = max([f for f in os.scandir("path\\to\\search")], key=lambda x: x.stat().st_mtime).name

1 Comment

Welcome to Stack Overflow. While this code may answer the question, providing additional context regarding why and/or how this code answers the question improves its long-term value. How to Answer
4
  • use os.walk to list files
  • use os.stat to get file modified timestamp (st_mtime)
  • put both timestamps and filenames in a list and sort it by timestamp, largest timestamp is most recently edited file.

Comments

2

For multiple files, if anyone came here for that:

import glob, os

files = glob.glob("/target/directory/path/*/*.mp4")
files.sort(key=os.path.getmtime)

for file in files:
   print(file)

This will print all files in any folder within /path/ that have the .mp4 extension, with the most recently modified file paths at the bottom.

Comments

1

You can use

os.walk

See: http://docs.python.org/library/os.html

Comments

1

Use os.path.walk() to traverse the directory tree and os.stat().st_mtime to get the mtime of the files.

The function you pass to os.path.walk() (the visit parameter) just needs to keep track of the largest mtime it's seen and where it saw it.

Comments

1

I'm using path = r"C:\Users\traveler\Desktop":

import os
def all_files_under(path):
   #"""Iterates through all files that are under the given path."""
   for cur_path, dirnames, filenames in os.walk(path):
      for filename in filenames:
         yield os.path.join(cur_path, filename)
latest_file = max(all_files_under('root'), key=os.path.getmtime)

What am i missing here?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.