我将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
这就是我希望成为的外包。所以基本上它需要从
开始“名字:姓氏:电子邮件”
然后名称,姓氏电子邮件将在下面添加,直到没有名字为止。
现在基本上很容易说 - 我想要的是,而不是清除并添加到相同的json文件data.json,我希望它创建一个名为data1.json的新文件 - 然后如果我重新运行程序再次tommorow等 - 它将是data2.json等等。
答案 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)
这有许多缺点:
我认为您最好使用轻量级数据库,例如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