![]() |
Retrieving last 20 file paths from directory - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Data Science (https://python-forum.io/forum-44.html) +--- Thread: Retrieving last 20 file paths from directory (/thread-35013.html) |
Retrieving last 20 file paths from directory - dyerlee91 - Sep-23-2021 Hello all, I'm having a hard time getting this script across the finish line. I want to display only the last 20 file paths in the given directory, but I keep hitting a wall. Right now, it prints all the file paths in the folder, but I only want to the last 20. Can anyone help point me in the right direction? import glob import os from pathlib import Path path = (r'\\directory') files = filter(lambda filepath: filepath.is_file(), Path(path).glob('*')) for file in files: print(file.absolute()) RE: Retrieving last 20 file paths from directory - snippsat - Sep-23-2021 Use code tags Code Tags. Could do it like this. import glob import os from pathlib import Path path = (r'\\directory') files = filter(lambda filepath: filepath.is_file(), Path(path).glob('*')) file_lst = [f for f in files][-20:] for file in file_lst: print(file) RE: Retrieving last 20 file paths from directory - dyerlee91 - Sep-24-2021 Awesome, thanks! Say I wanted to print the last 20 file paths from separate directories. For example, my setup would be: (r'\\directory\asset1\asset1_runfile') (r'\\directory\asset2\asset2_runfile') (r'\\directory\asset3\asset3_runfile') (r'\\directory\asset4\asset4_runfile') How would I go about printing the last 20 file names of each "asset" without writing the same code with that slight variation over and over? RE: Retrieving last 20 file paths from directory - DeaD_EyE - Sep-24-2021 (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. |