





Я делал это в прошлом для скрипта Python, чтобы определить последние обновленные файлы в каталоге:
import glob
import os
search_dir = "/mydir/"
# remove anything from the list that is not a file (directories, symlinks)
# thanks to J.F. Sebastion for pointing out that the requirement was a list
# of files (presumably not including directories)
files = list(filter(os.path.isfile, glob.glob(search_dir + "*")))
files.sort(key=lambda x: os.path.getmtime(x))
Это должно делать то, что вы ищете, на основе файла mtime.
РЕДАКТИРОВАТЬ: обратите внимание, что вы также можете использовать os.listdir () вместо glob.glob (), если хотите - причина, по которой я использовал glob в моем исходном коде, заключалась в том, что я хотел использовать glob только для поиска файлов с определенным набором расширений файлов, для которых больше подходит glob (). Вот как это будет выглядеть для использования listdir:
import os
search_dir = "/mydir/"
os.chdir(search_dir)
files = filter(os.path.isfile, os.listdir(search_dir))
files = [os.path.join(search_dir, f) for f in files] # add path to each file
files.sort(key=lambda x: os.path.getmtime(x))
Эти решения не исключают каталоги из списка.
В вашем решении os.listdir отсутствует os.path.join: files.sort (lambda x, y: cmp (os.path.getmtime (os.path.join (search_dir, x)), os.path.getmtime (os .path.join (search_dir, y))))
files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
files = filter(os.path.isfile, os.listdir(search_dir))
Ваше решение не сортируется по дате создания, как запрашивает OP. См. stackoverflow.com/questions/168409/…
@ J.F. - на самом деле вопрос задает дату [создано | изменено], поэтому mtime - лучший выбор, чем ctime.
@ J.F. - спасибо, что указали на «ключевой» параметр для сортировки, который был добавлен в Python 2.4, и этот код изначально был на Python 2.3, поэтому в то время я не знал об этом. Узнавайте что-то новое каждый день!
Обычный files.sort(key=os.path.getmtime) должен работать (без lambda).
Примечание: после os.chdir(search_dir) вам не нужен os.listdir(search_dir); вместо этого вы можете использовать os.listdir(os.curdir), и поэтому os.path.join(search_dir, f) вам тоже не нужен. Вы можете заменить последние 3 строки на это: files = sorted(filter(os.path.isfile, os.listdir(os.curdir)), key=os.path.getmtime)
В случае большой папки, и если нужен только последний файл, нет более эффективного способа сделать это, верно?
@FooBar для отслеживания папки на предмет новых файлов, вы можете использовать модуль watchdog. Чтобы найти последний созданный файл в данном каталоге только один раз, достаточно max() + os.scandir() или os.listdir(). Вот пример кода (текст на русском языке)
Как мне управлять временем, которое оно дает мне? Например, я хочу посмотреть файлы старше одной недели? Есть ли способ преобразовать вывод os.path.getmtime (x) в дату?
os.chdir () имеет значение, хотя у меня есть абсолютный путь. Добро пожаловать в Python!
Возможно, вам стоит использовать команды оболочки. В Unix / Linux команда find piped with sort, вероятно, сможет делать то, что вы хотите.
Вот однострочник:
import os
import time
from pprint import pprint
pprint([(x[0], time.ctime(x[1].st_ctime)) for x in sorted([(fn, os.stat(fn)) for fn in os.listdir(".")], key = lambda x: x[1].st_ctime)])
Это вызывает os.listdir () для получения списка имен файлов, затем вызывает os.stat () для каждого из них, чтобы получить время создания, а затем выполняет сортировку по времени создания.
Обратите внимание, что этот метод вызывает os.stat () только один раз для каждого файла, что будет более эффективно, чем вызов его для каждого сравнения в сортировке.
это вряд ли питонический язык, хотя он решает задачу (отказ от ответственности: не тестировал код).
Это решение не исключает каталоги из списка.
@Constantin: это правда, но быстрый [... if stat.S_ISREG (x)] справится с этим.
Вот моя версия:
def getfiles(dirpath):
a = [s for s in os.listdir(dirpath)
if os.path.isfile(os.path.join(dirpath, s))]
a.sort(key=lambda s: os.path.getmtime(os.path.join(dirpath, s)))
return a
Сначала мы создаем список имен файлов. isfile () используется для пропуска каталогов; его можно не указывать, если необходимо включить каталоги. Затем мы сортируем список на месте, используя дату изменения в качестве ключа.
Оно отсортировано от самых старых к самым новым. Когда мне понадобились 5 новейших файлов, мне пришлось сделать следующий a[-5:]
sorted(filter(os.path.isfile, os.listdir('.')),
key=lambda p: os.stat(p).st_mtime)
Вы можете использовать os.walk('.').next()[-1] вместо фильтрации с помощью os.path.isfile, но при этом в списке останутся мертвые символические ссылки, и os.stat не сможет обработать их.
Обновлять: для сортировки записей dirpath по дате модификации в Python 3:
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
(put @Pygirl's answer here for greater visibility)
Если у вас уже есть список имен файлов files, чтобы отсортировать его на месте по времени создания в Windows:
files.sort(key=os.path.getctime)
Список файлов, которые вы могли бы получить, например, используя glob, как показано в @ Ответ Джея.
old answer
Вот более подробная версия @Greg Hewgill ответ. Он наиболее соответствует требованиям вопроса. Он делает различие между датами создания и изменения (по крайней мере, в Windows).
#!/usr/bin/env python
from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time
# path to the directory (relative or absolute)
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
# get all entries in the directory w/ stats
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath))
entries = ((os.stat(path), path) for path in entries)
# leave only regular files, insert creation date
entries = ((stat[ST_CTIME], path)
for stat, path in entries if S_ISREG(stat[ST_MODE]))
#NOTE: on Windows `ST_CTIME` is a creation date
# but on Unix it could be something else
#NOTE: use `ST_MTIME` to sort by a modification date
for cdate, path in sorted(entries):
print time.ctime(cdate), os.path.basename(path)
Пример:
$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py
Это сработало отлично. Я пытаюсь сравнить два каталога cdate друг с другом. Есть ли способ сравнить секунды между двумя cdates?
@malcmcmul: cdate - это число с плавающей запятой в секундах с начала эпохи.
Это работает, но самое лаконичное решение - stackoverflow.com/a/4500607/68534
@jmoz: вы имеете в виду как это. Решение, которое вы ссылаетесь, неверное: оно не фильтрует обычные файлы. Примечание: мое решение вызывает stat один раз за ввод каталога.
Простите, ссылка, предоставленная Sabastian, еще более лаконична! Спасибо.
Есть функция os.path.getmtime, которая показывает количество секунд с начала эпохи.
и должен быть быстрее, чем os.stat.
import os
os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)
это основной шаг для обучения:
import os, stat, sys
import time
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
listdir = os.listdir(dirpath)
for i in listdir:
os.chdir(dirpath)
data_001 = os.path.realpath(i)
listdir_stat1 = os.stat(data_001)
listdir_stat2 = ((os.stat(data_001), data_001))
print time.ctime(listdir_stat1.st_ctime), data_001
Вот мой ответ с использованием glob без фильтра, если вы хотите читать файлы с определенным расширением в порядке дат (Python 3).
dataset_path='/mydir/'
files = glob.glob(dataset_path+"/morepath/*.extension")
files.sort(key=os.path.getmtime)
Без смены каталога:
import os
path = '/path/to/files/'
name_list = os.listdir(path)
full_list = [os.path.join(path,i) for i in name_list]
time_sorted_list = sorted(full_list, key=os.path.getmtime)
print time_sorted_list
# if you want just the filenames sorted, simply remove the dir from each
sorted_filename_list = [ os.path.basename(i) for i in time_sorted_list]
print sorted_filename_list
Ответ Алекса Ковентри вызовет исключение, если файл является символической ссылкой на несуществующий файл, следующий код исправляет этот ответ:
import time
import datetime
sorted(filter(os.path.isfile, os.listdir('.')),
key=lambda p: os.path.exists(p) and os.stat(p).st_mtime or time.mktime(datetime.now().timetuple())
Когда файл не существует, используется now (), а символическая ссылка будет находиться в самом конце списка.
В Python 3.5+
from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
вместо даты создания используйте f.stat().st_ctime.
Вот пара простых строк, которые ищут расширение, а также предоставляют возможность сортировки
def get_sorted_files(src_dir, regex_ext='*', sort_reverse=False):
files_to_evaluate = [os.path.join(src_dir, f) for f in os.listdir(src_dir) if re.search(r'.*\.({})$'.format(regex_ext), f)]
files_to_evaluate.sort(key=os.path.getmtime, reverse=sort_reverse)
return files_to_evaluate
# *** the shortest and best way ***
# getmtime --> sort by modified time
# getctime --> sort by created time
import glob,os
lst_files = glob.glob("*.txt")
lst_files.sort(key=os.path.getmtime)
print("\n".join(lst_files))
пожалуйста, предоставьте контекст
«лучший» - это субъективно. Ваш ответ был бы лучше, если бы вы объяснили, почему вы думаете, что это лучший способ.
Если вы хотите «лучшего», вы, конечно, не используйте glob, так как он очень медленный.
Для полноты с os.scandir (в 2 раза быстрее, чем pathlib):
import os
sorted(os.scandir('/tmp/test'), key=lambda d: d.stat().st_mtime)
from pathlib import Path
import os
sorted(Path('./').iterdir(), key=lambda t: t.stat().st_mtime)
или же
sorted(Path('./').iterdir(), key=os.path.getmtime)
или же
sorted(os.scandir('./'), key=lambda t: t.stat().st_mtime)
где m время - модифицированное время.
Это была моя версия:
import os
folder_path = r'D:\Movies\extra\new\dramas' # your path
os.chdir(folder_path) # make the path active
x = sorted(os.listdir(), key=os.path.getctime) # sorted using creation time
folder = 0
for folder in range(len(x)):
print(x[folder]) # print all the foldername inside the folder_path
folder = +1
В моем коде файлы отсортированы от самых старых до самых новых. Чтобы сначала получить новейшие имена файлов или папок, вам нужно добавить reverse = True в список файлов (в моем случае это было x). итак, x = sorted (os.listdir (), key = os.path.getctime, reverse = True)
Оказывается, os.listdir сортируется по последнему изменению, но в обратном порядке, поэтому вы можете:
import os
last_modified=os.listdir()[::-1]
glob () хорош, но имейте в виду, что он пропускает файлы, начинающиеся с точки. Системы * nix обрабатывают такие файлы как скрытые (таким образом, исключая их из списков), но в Windows они являются обычными файлами.