Python чтение и запись файлов - скрипт - PullRequest
0 голосов
/ 19 июня 2020

Я пишу сценарий в python, чтобы перейти к папке на моем рабочем столе, прочитать файлы (используя шаблоны глобусов, поскольку я буду добавлять файлы каждый день или около того) и копировать их содержимое в один отдельный файл .txt.

Я написал следующий скрипт:

#!/usr/bin/env python3
with open('../python_diary.txt', 'w') as outfile:
    for filename in glob.glob('../Desktop/diary/*-2020.txt'):
        with open(filename) as infile:
            for line in infile:
                outfile.write(line)

Скрипт обычно работает нормально, но мои файлы находятся в формате дд-мм-гггг, и при запуске скрипта они появляются в моем конечном файле в следующем порядке (до сегодняшнего дня): 19-06-2020 17-06-2020 16-06-2020 18-06-2020

Любая идея, как я могу заставить эти объединенные файлы отображаться от самых старых к новейшим ?

Спасибо,

1 Ответ

2 голосов
/ 19 июня 2020

Вы можете выполнить сортировку глобуса с помощью нескольких уловок, чтобы добраться до даты и времени. Предполагая, что ваши временные метки - это все месяцы и дни с нулями с 4-di git год, это будет работать для вас:

import os
from glob import glob

# Grab the filenames matching this glob
filenames = glob.glob('../Desktop/diary/*-2020.txt')
# Sort the filenames by ascending date
def filename_to_isodate(filename):
    date = os.path.basename(filename).rsplit('.', 1)[0][-10:]
    return date[-4:] + date[3:5] + date[:2]

filenames = sorted(filenames, key=filename_to_isodate)
for filename in filenames:
    ...  # Your stuff here...

Пояснение os.path.basename дает нам имя файла, например, '../Desktop/diary/01-01-2020.txt' становится '01 -01-2020.txt '

rsplit('.', 1)[0][-:10] разбивает базовое имя на период, эффективно удаляя расширение и захват только того, что находится перед расширением. [-10:] захватывает только 10 символов, составляющих дату, в данном случае 4 для года + 2 для месяца + 2 для дня + 2 дефиса = 10 символов.

Наконец, при сортировке мы используем sorted с key, чтобы указать функции сортировки по дате ISO (год, месяц, день).


изменить : после ввода от @Daniel F, strptime из модуля datetime заменяется простым использованием даты в строковом формате ISO при сортировке для повышения скорости. Ниже был приведен исходный метод, использованный в этом ответе.

Встроенный модуль datetime может использоваться для анализа даты и времени в заданном формате, в данном случае: %d-%m-%Y. strptime дает объект datetime, который можно обрабатывать численно, что означает, что его можно сравнивать и, таким образом, сортировать. os.path.basename (s) .rsplit ('.', 1) [0] [- 10:], '% d-% m-% Y'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...