如何在每个脚本运行后创建新的JSON数据

时间:2018-05-30 20:52:40

标签: python json

我将JSON数据存储在变量数据中。

我想让它在每次运行后写入文本文件,所以我知道哪个数据json是新的,而不是重写相同的Json。

目前,我正在尝试这个:

Saving = firstname + ' ' + lastname+ ' - ' + email
with open('data.json', 'a') as f:
    json.dump(Saving, f)
    f.write("\n")

只是添加到json文件和第一个代码开始的脚本的开头,我用

清理它
Infotext = "First name : Last name : Email"
    with open('data.json', 'w') as f:
        json.dump(Infotext, f)
        f.write("\n")

如何制作而不是重写相同的Json,而是使用 Infotext 信息创建新文件,然后加上 Saving

Json的输出:

"First name : Last name : Email"
Hello        World   - helloworld@test.com
Hello2           World   - helloworld2@test.com
Hello3           World   - helloworld3@test.com
Hello4           World   - helloworld4@test.com

这就是我希望成为的外包。所以基本上它需要从

开始

“名字:姓氏:电子邮件”

然后名称,姓氏电子邮件将在下面添加,直到没有名字为止。

enter image description here

现在基本上很容易说 - 我想要的是,而不是清除并添加到相同的json文件data.json,我希望它创建一个名为data1.json的新文件 - 然后如果我重新运行程序再次tommorow等 - 它将是data2.json等等。

3 个答案:

答案 0 :(得分:1)

JSON文件应包含字符串列表。您应该将文件的当前内容读入变量,附加到变量,然后重写文件。

with open("data.json", "r") as f:
    data = json.load(f)
data.append(firstname + ' ' + lastname+ ' - ' + email)
with open("data.json", "w") as f:
    json.dump(data, f)

答案 1 :(得分:1)

只需在文件名中使用日期时间,即可在每次运行代码时创建唯一文件。在这种情况下,粒度会降低到每秒,因此,如果代码每秒运行多次,您将覆盖文件的现有内容。在这种情况下,请降级到名称中包含微秒的文件名。

import datetime as dt
import json

time_script_run = dt.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')
with open('{}_data.json'.format(time_script_run), 'w') as outfile:
    json.dump(Infotext, outfile)

这有许多缺点:

  1. 你的文件数量会越来越多
  2. 即使您在其名称中加载了最新日期时间的文件(并且发现该文件在运行时增长),您也只能看到上次运行前一次的数据;完整的历史很难查找。
  3. 我认为您最好使用轻量级数据库,例如sqlite3

    import sqlite3
    import random
    import time
    
    import datetime as dt
    
    # Create DB 
    with sqlite3.connect('some_database.db') as conn:
        c = conn.cursor()
    
        # Just for this example, we'll clear the whole table to make it repeatable
        try:
            c.execute("DROP TABLE user_emails")
        except sqlite3.OperationalError: # First time you run this code
            pass
    
        c.execute("""CREATE TABLE IF NOT EXISTS user_emails(
                         datetime TEXT,
                         first_name TEXT,
                         last_name TEXT,
                         email TEXT)
                  """)
    
        # Now let's create some fake user behaviour
        for x in range(5):
            now = dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            c.execute("INSERT INTO user_emails VALUES (?, ?, ?, ?)", 
                      (now, 'John', 'Smith', random.randint(0, 1000)))
            time.sleep(1) # so we get new timestamps
    
    
    # Later on, doing some work
    with sqlite3.connect('some_database.db') as conn:
        c = conn.cursor()
    
        # Get whole user history
        c.execute("""SELECT * FROM user_emails 
                     WHERE first_name = ? AND last_name = ?
                     """, ('John', 'Smith'))
        print("All data")
        for row in c.fetchall():
            print(row)
        print('...............................................................')
    
        # Or, let's get the last email address
        print("Latest data")
        c.execute("""
                  SELECT * FROM user_emails 
                  WHERE first_name = ? AND last_name = ?
                  ORDER BY datetime DESC
                  LIMIT 1;
                  """, ('John', 'Smith'))
        print(c.fetchall())
    

    注意:数据检索在此代码中运行得非常快,运行起​​来只需约5秒,因为我使用time.sleep(1)来生成虚假用户数据。

答案 2 :(得分:0)

我认为你可以做的是对文件使用seek()并写入json文件的相关位置。例如,你需要更新firstname,你寻找:firstname后,并在那里更新文本。 这里有一些例子: https://www.tutorialspoint.com/python/file_seek.htm