2 回答
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")
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
在第二个函数中编写 , 。
添加回答
举报