我目前正在制作一个python脚本,通过在首次从网站解析数据然后使用twilio从该数据发送消息后发送电子邮件来自动执行任务。
但我想要的是首先比较解析的数据与我之前解析的现有json文件,如果它有相同的日期或消息,那么它不应该发送消息。
我不知道如何做到这一点我试图加载json文件,但我无法让它正常工作。
这是我要检查的json文件:
{
"date": "11/02/2016 11:42:57",
"message": "Dear students,\r\n\r\nAs informed in the class, this is to remind you Today special class from 6 to 6.50 pm at same venue SJT 126.\r\n\r\nregards\r\n\r\nR. Raghavan\r\nSITE",
"name": "RAGHAVAN R (SITE)",
"subject": "ITE308 - Distributed Systems - TH"
}
这是我的代码:
infoTable = tables[0].findAll('tr')
name = infoTable[2].findAll('td')[0].text
if (len(name) is 0):
return None
subject = infoTable[2].findAll('td')[1].text
msg = infoTable[2].findAll('td')[2].text
sent = infoTable[2].findAll('td')[3].text
textmyself.textmyself(msg)
# Parsing the open hours of the faculties
outputPath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'output')
if os.path.isdir(outputPath) is False:
os.makedirs(outputPath)
result = {'name': name, 'subject': subject, 'message': msg, 'date': sent}
with open('output/' + str(facultyID) + '.json', 'w') as outfile:
json.dump(result, outfile, indent=4)
return result
更新:以下是我尝试过的,但是如果第一次运行脚本,json文件应该已经存在,那么我的代码是否正确?
with open('output/WS.json') as data_file:
data = json.load(data_file)
if data["date"] == sent:
outputpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'output')
if os.path.isdir(outputpath) is False:
os.makedirs(outputpath)
result = {'name': name, 'subject': subject, 'message': msg, 'date': sent}
with open('output/' + str(facultyID) + '.json', 'w') as outfile:
json.dump(result, outfile, indent=4)
return result
else:
outputpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'output')
if os.path.isdir(outputpath) is False:
os.makedirs(outputpath)
result = {'name': name, 'subject': subject, 'message': msg, 'date': sent}
with open('output/' + str(facultyID) + '.json', 'w') as outfile:
json.dump(result, outfile, indent=4)
textmyself.textmyself(msg)
return result
答案 0 :(得分:0)
您可以使用以下方法立即加载旧的JSON文件:
import json
with open('old_data.json') as f:
old_message = json.load(f)
然后你可以比较
if not old_message['date'] == sent:
# send your mail etc.
然后将您的数据捆绑到另一个JSON中并使用新消息写回文件:
new_message = {
"date" : sent,
... }
with open('old_data.json', 'w') as f:
json.dump(new_message, f)
将这些碎片与您已有的碎片放在一起,并添加一些错误处理,可以解决您的问题。
答案 1 :(得分:0)
您遇到一些问题,例如在知道输出文件存在之前尝试打开输出文件。这是你如何做到的。
作为旁注,您可以从执行脚本的路径计算outputPath
,但在当前目录中使用"output"
。两者都有问题。第一个不适用于无法编写目录且可能与其他用户冲突的已安装脚本。第二种方式取决于CWD恰好在哪里。第三种方法是将输出基于用户的主目录os.path.join(os.path.expanduser("~"), 'output')
。
output_path = os.path.join(os.path.expanduser("~"), 'output')
if not os.path.isdir(output_path):
os.makedirs(output_path)
output_file = os.path.join(output_path, '{}.json'.format(facultyID))
if os.path.isfile(output_file):
with open(output_file) as data_file:
old = json.load(data_file)
if old['date'] == date or old['message'] == msg:
print('email already sent')
return None
result = {'name': name, 'subject': subject, 'message': msg, 'date': sent}
with open(output_file, 'w') as data_file:
json.dump(result, data_file, indent=4)
return result