检查json文件是否已经包含我在python中覆盖的数据

时间:2016-02-14 17:58:50

标签: python json

我目前正在制作一个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

2 个答案:

答案 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