首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生日提醒应用程序:功能不显示

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

Stack Overflow用户
提问于 2020-09-03 05:48:13
回答 2查看 222关注 0票数 2

我刚开始编程,我试着构建这个生日提醒应用程序,但没有遵循特定的教程,而是试图自己解决它,但我被困住了。

第一个函数将生日添加到.txt文件中,没有问题。但是对于第二个问题,无论我试图从birthday_dict或文件中检索生日数据,这个函数都不会运行。

对于第二个函数,我尝试调整这个https://www.geeksforgeeks.org/birthday-reminder-application-python/,但是它仍然不能工作。

如果有人能帮我,那就太好了。谢谢!

代码语言:javascript
复制
import datetime
from datetime import date, timedelta


birthday_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!')
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-03 06:21:34

这个脚本包含了几个错误。我试着一个接一个地给他们讲讲。我给它们编号以供参考。

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

这可以通过将文件名移动到全局变量或函数参数来解决。特别是当您开始编程时,我强烈反对使用全局变量,因此让我们使用函数参数(参见下面的)。

当使用

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

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

还有一些小窍门:

您可以使用variable

  • Instead查看使用birthday_dict.update({name: date_str})的类型,您也可以简单地编写birthday_dict[name] = date_str

小“练习”

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

全局变量的

  • :您有一个全局变量birthday_dict。想一想如何使它成为“局部变量”。提示:它非常类似于对文件名所做的更改.

代码语言:javascript
复制
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")
票数 3
EN

Stack Overflow用户

发布于 2020-09-03 06:02:20

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

代码语言:javascript
复制
file = open("test.txt", "r")
lines = file.readlines() # lines = ['hello','test']

lines变量将是一个列表,您可以这样做:

代码语言:javascript
复制
for line in lines:
    print(line)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63717583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档