仅查找并显示给定特定日期的文件

Find and show only files from a specific date given

基本上我有一个包含大量存档文件的 tacacs 文件夹,准确地说,每天创建 3 个。 我正在寻找一个脚本,用户在启动脚本时必须输入一个日期,并向他显示在该日期创建(或最后修改)的文件。

我还打算让用户必须在 3 个文件中选择他想看的那个。但现在我只是想在 cli 上显示这三个文件。

但是我的脚本不接受我给它的日期。我每次都收到“SyntaxError:无效语法”,同时显示我输入的月份。

      Traceback (most recent call last):
  File "scriptacacs2.py", line 6, in <module>
    date_entry = input('Enter a date in YEAR, MONTH, DAY format \n')
  File "<string>", line 1
    2022 04 12
          ^
SyntaxError: invalid syntax

密码是:

import re
import sys
import os
from datetime import datetime

date_entry = input('Enter a date in YEAR, MONTH, DAY format \n')
path = "/applis/tacacs/log/"
dirs = os.listdir(path)

mtime = datetime(date_entry).timestamp()

list_of_files = [
    file for file in glob.glob(path + '*.gz')
        if os.path.getmtime(file) == mtime
]
print (list_of_files)

我不明白是什么导致了这个语法错误。我的代码有什么问题?

我不确定你为什么会收到 SyntaxError 错误。我猜这是因为你使用 Python2 和 input 的行为不同(它试图解析输入)对于 python2 你应该使用 raw_input.

但是日期解析不正确

如果您希望它以 2022,01,01 格式解析日期,您应该使用:

datetime.strptime("2022,01,23", "%Y,%m,%d") 或者如果你希望能够在 do:

中使用空格

datetime.strptime(re.sub("\s+", "", "2022, 01, 23"), "%Y,%m,%d")

另外,您可能不想测试时间戳是否相等,而是想检查日期是否相等。所以我会这样做:


import re
import os
import glob
from datetime import datetime, timedelta

date_entry = input('Enter a date in YEAR, MONTH, DAY format \n')
date = datetime.strptime(re.sub("\s+", "", date_entry), "%Y,%m,%d").date()

path = "/applis/tacacs/log/"


list_of_files = [
    file for file in glob.glob(path + '*.gz')
    if date == datetime.fromtimestamp(os.path.getmtime(file)).date()
]
print(list_of_files)

您的第一个问题是您尝试为 datetime 对象提供一个字符串,但是,他需要整数。 (参见 documentation)。所以首先,您需要使用 split 方法拆分您收到的日期。 (这里我改变了一点输入,以便有一个更具可读性和实用性的句子)。然后,您需要使用 map 函数将数字作为字符串转换为整数,最后使用 * 解压值以传递参数。

您的第二个问题是在您已经使用 listdir 方法检索文件时使用了 glob 库。

最后,您使用时间戳检查文件的日期是错误的,因为时间戳值表示自 1970 年 1 月 1 日以来的秒数,如果一个文件一个接一个地创建,它们将不会具有相同的时间戳。因此,您必须将这些时间戳转换为日期,然后检查日期是否相同。

这是最终结果:

import os

from datetime import datetime

PATH = "applis/tacacs/log/"


def is_same_date(t1, t2):
    """
    Check if the two provided timestamps represents the same date
    """
    return datetime.fromtimestamp(t1).date() == datetime.fromtimestamp(t2).date()


date_entry = map(int, input("Enter a date in 'YYYY/MM/DD' format \n").split("/"))

dirs = os.listdir(PATH)

mtime = datetime(*date_entry).timestamp()

list_of_files = [f for f in dirs if is_same_date(os.path.getmtime(PATH + f), mtime)]
print(list_of_files)