为了账号安全,请及时绑定邮箱和手机立即绑定

生日提醒应用程序:功能不显示

生日提醒应用程序:功能不显示

一只斗牛犬 2023-07-11 10:35:54
我是编程新手,我试图在不遵循特定教程的情况下构建这个生日提醒应用程序,而是尝试自己解决它,但我被困住了。第一个函数将生日添加到 .txt 文件中,没问题。但对于第二个,无论我尝试从birthday_dict还是从文件中检索生日数据,该函数都不会运行。对于第二个功能,我尝试调整这个https://www.geeksforgeeks.org/birthday-reminder-application-python/,但它仍然不起作用。如果有人能帮助我,那就太好了。谢谢!import datetimefrom datetime import date, timedeltabirthday_dict = {}def add_to_log():    name = input("Name: ")    date_str = input("Birthday (day/month) :")    birthday_dict.update({name: date_str})    with open('./venv/birthday_log.txt', mode='a') as birthday_log:        file = birthday_log.write(f'\n {name}:{date_str}')    print ('Birthday added!')def reminder():    file = open('birthday_log.txt', 'r')    today = date.today()    today.strftime("%d/%m")    flag = 0    for line in file:        if today in file:            line = line.split(':')            flag = 1            print (f'Today is {line[1]}\'s birthday!')
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

该脚本包含一些错误。我将尝试一一解决它们。我给它们编号以供参考。

  • [1] 您不要在这两个函数上使用相同的文件名。在一处使用 ./venv/birthday_log.txt', and in another place you use birthday_log.txt`(不带子文件夹)。

    这可以通过将文件名移动到全局变量或函数参数中来解决。特别是当您开始编程时,我非常不鼓励使用全局变量,所以让我们使用函数参数(见下文)

  • [2] 使用时,date.today()您将今天的日期作为“日期”类型的变量获取。但是当你想将其与文本进行比较时,你需要将其转换为“str”。你通过调用它来正确地做到这一点.strftime(...)。但该调用将返回字符串值。它不会修改现有的日期对象。因此,您需要将结果存储在一个新变量中,以便稍后使用。

  • [3] 当测试是否找到今天的日期时,您使用in带有日期对象(如[2]中提到的)和文件对象的运算符,这是不起作用的。我们需要在运算符的两侧使用“字符串” in。在左侧,我们可以使用在[2]中创建的新变量,在右侧,我们可以使用line它代表我们正在循环的当前行。

还有一些提示:

  • 您可以使用print(type(variable))查看变量的类型

  • 除了使用之外,birthday_dict.update({name: date_str})您还可以简单地编写birthday_dict[name] = date_str

小“练习”

  • 将我在脚本最后编写的两行移动到“main”函数中。这样您就可以使用一个变量作为文件名并删除重复的值。您也可以使用全局变量,但正如前面提到的,最好避免使用。将这些行包装在“主”函数中将解决该问题。

  • 关于全局变量:您有一个全局变量birthday_dict。考虑如何使其成为“局部”变量。提示:这与对文件名所做的更改非常相似。

import datetime

from datetime import date, timedelta



birthday_dict = {}

def add_to_log(filename):

    name = input("Name: ")

    date_str = input("Birthday (day/month) :")

    birthday_dict.update({name: date_str})


    # [1] Using a variable here makes it easier to ensure we only specify the

    # filename once

    with open(filename, mode='a') as birthday_log:

        file = birthday_log.write(f'\n {name}:{date_str}')

    print ('Birthday added!')


def reminder(filename):

    # [1] Using a variable here makes it easier to ensure we only specify the

    # filename once

    file = open(filename, 'r')

    today = date.today()

    # [2] After creating a reference for "today", you need to store the

    # "string" conversion in a new variable and use that later

    today_str = today.strftime("%d/%m")

    flag = 0

    for line in file:

        # [3] You want to check that the date you need is contained in the

        # line, not the file object

        if today_str in line:

            line = line.split(':')

            flag = 1

            print (f'Today is {line[1]}\'s birthday!')



add_to_log("birthday_log.txt")

reminder("birthday_log.txt")


查看完整回答
反对 回复 2023-07-11
?
互换的青春

TA贡献1797条经验 获得超6个赞

要查看文件中的所有行,您需要.readlines()从变量运行 with open(),这将生成一个列表,如下所示:

file = open("test.txt", "r")
lines = file.readlines() # lines = ['hello','test']

lines变量将是一个列表,您可以执行以下操作:

for line in lines:
    print(line)

另外,您可能想for today in line在第二个函数中编写 , 。


查看完整回答
反对 回复 2023-07-11
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信