Sep-24-2021, 12:55 PM
(Sep-23-2021, 04:46 PM)dyerlee91 Wrote: I want to display only the last 20 file paths in the given directory, but I keep hitting a wall.
If you just use glob, the order is not alphabetical nor by modification time. Actually, I don't know if there is any kind of order. Maybe the inode-number define the order, but I am not certain.
You can use sorted with a key-function to define the order, and you can reverse it as well.
Her an example with sort_by_mtime, sort_by_ctime, sort_by_alpha:
from pathlib import Path def sort_by_mtime(pathlike: Path): return pathlike.stat().st_mtime def sort_by_ctime(pathlike: Path): return pathlike.stat().st_ctime def sort_by_alpha(pathlike: Path): return str(pathlike.name) def last_files(directory, pattern, last_files=10, key_function=None): path_iterator = Path(directory).glob(pattern) if callable(key_function): # if key_function is None or not callable, this branch is not executed sorted_iterator = sorted(path_iterator, key=key_function, reverse=True) else: # no key_function, so sorting by name alphanumeric implicit sorted_iterator = sorted(path_iterator, reverse=True) file_count = 0 for path in sorted_iterator: if path.is_dir(): # skipping directories continue if file_count >= last_files: return yield path file_count += 1The function is a generator, you've to consume it.
files = list(last_files("/home/pi/Downloads", pattern="*.txt", last_files=5, key_function=sort_by_ctime)) # list files in Download # with *.txt # and the last 5 of it. # the last file comes first in list, the second last file comes second ...As you can see, you can also use functions as arguments. This function (sort_by_ctime) is called by sorted for each file to get a value back for comparison. This value could be an
int
or a str
or something else, but must then always return the same data-type.I hope this is not overcomplicated.
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
All humans together. We don't need politicians!