【问题标题】:Search a File for Today's Date in Python用 Python 在文件中搜索今天的日期
【发布时间】:2016-07-18 15:16:04
【问题描述】:

更新:如果您尝试在 Python 中搜索文件以查找今天的日期,我已在下面的答案部分中发布了我的最终代码。

我有一个文件夹,其中包含由程序创建的日志。日志标题包含用户名和创建日志的日期。我正在尝试编写一个 Python 脚本来打开包含今天日期的日志并读取它们。我使用 datetime 来获取今天的日期,并使用 if today in logFolderContent[x] 来搜索日期。我能够使该脚本的较小版本正常工作(搜索三个字符串),但是当我尝试重写它以搜索文件夹时,我遇到了问题。

以下是我的脚本。感谢@Steven Summers 的帮助,我的代码更加简洁了。我用新代码替换了旧代码。从那以后,我意识到脚本在尝试与今天的文件交互时会崩溃。

import os
import datetime

#  <><><><><><><><><><><><><><>     Get Today's Date    <><><><><><><><><><>    
today = datetime.date.today()
today = str(today)
runDate = today
print("Today's Date:", today, "\n\n\n")

#  <><><><><><><><><><><><><>     Get all today's files   <><><><><><><><><>    
logFolder = r"\\foamfile\logs\POHistory"
logFolderContent = os.listdir(logFolder)  # WORKING
logFolderContent.reverse()
print("log folder content", logFolderContent)
countFolderContent = len(logFolderContent)  # WORKING
print("Total Files in Folder:", countFolderContent)
eligibleLogs = []
continueLogSearch = "true"
x = 0
for i, file in enumerate(logFolderContent):
    if file.startswith(today):
        eligibleLogs.append(i)
        print("eligibleLogs[i] = ", eligibleLogs[i])
    elif not file.endswith(".txt"):
        print("Non-text file found and ignored")
    print(logFolderContent[i])

这是输出:

Today's Date: 2016-07-18

log folder content ['Thumbs.db', '2016-07-18-WIN7-BUYING.txt', (etc...) '2016-04-20-ERIC-NEW.txt']
Non-text file found and ignored
Thumbs.db
Traceback (most recent call last):
  File "U:/JustinG/Python/Directory/Complete_1.py", line 24, in <module>
    print("eligibleLogs[i] = ", eligibleLogs[i])
IndexError: list index out of range

process finished with exit code 1

当我删除 logFolderContent.reverse() 行时,脚本会打印所有文件名(意味着它们满足以下要求)并在到达具有今天日期的文件名时崩溃。

【问题讨论】:

  • “当我反转组 logFolderContent”是什么意思,文件夹中真的有 584 个文件吗?其中有 15 个没有 .txt 吗?
  • @pwnsauce 。 list.reverse() 。而不是 [file1, file2, file3] 它将是 [file3, file2, file1]
  • @pwnsauce 我会将打印输出放在代码下。也许这会有所帮助

标签: python python-3.x datetime search


【解决方案1】:

我建议使用 for 循环而不是 while 循环,看起来像

for i, file in enumerate(logFolderContent):
    if file.startswith(today): # Assuming the files always start with the date
        eligibleLogs.append(i)
        # -1 gets last item in list | most recent
        print("eligibleLogs[i] = ", eligibleLogs[-1]) 
    elif not file.endswith(".txt"):
        print("Non-text file found and ignored")
        print(logFolderContent[i])

如果非文本文件也可以以日期开头,则交换 if 语句,以便首先检查文件是否为文本文件。或者添加一个 and 语句,使其以日期开头并以 .txt 结尾

你所拥有的一个大问题是因为这条线和一个 try / except 语句

print("eligibleLogs[x] = ", eligibleLogs[x])

问题在于,因为不是每个文件都匹配日期,eligibleLogs 的大小与x 不匹配,所以几乎可以保证,当 while 循环终止时,您最多只能在列表中获得一项。

例如,您的第一个匹配项可能是文件号 100,因此您的列表中有 1 个项目,但您随后尝试获取索引 100 处的项目,这会导致 IndexError。然后你的循环终止,你得到了你没有预料到的值。

另外你可能知道,但只是指出来。

eligibleLogs.append(i)

正在附加它匹配的文件的索引。也许您更喜欢这样,以便您的列表包含找到的匹配文件名。

eligibleLogs.append(file)

【讨论】:

    【解决方案2】:

    感谢 Steven Summers(请参阅上面的答案)并花一点时间玩弄我的代码,我终于让脚本按预期工作了。如果其他人试图在 Python 中搜索今天的日期的字符串,我已经重写了我的代码以服务于更通用的目的并将其放在下面。感谢所有提供帮助的人,希望此代码对其他人有所帮助。

    import os
    import datetime
    # <><><><><><><><><><>  Get Today's Date  <><><><><><><><><><>
    today = datetime.date.today()
    today = str(today)
    # <><><><><><><><><><>  Get Today's Files  <><><><><><><><><><>
    folder = "folderlocation"
    folderContent = os.listdir(folder)
    eligibleFiles = []
    for i, file in enumerate(folderContent):
         if file.startswith(today):  # or -> if today in file
              eligibleFiles.append(file)
    print(eligibleFiles)
    

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2014-02-05
      • 2012-01-21
      • 2014-04-03
      相关资源
      最近更新 更多