Вы должны использовать библиотеку Python CSV для записи ваших файлов CSV. Он берет список, содержащий все элементы для строки, и автоматически добавляет разделители для вас. Если значение содержит запятую, оно автоматически добавляет кавычки для вас (именно так должны работать файлы CSV). Он может даже обрабатывать переводы строк внутри значения. Если вы откроете полученный файл в приложении для работы с электронными таблицами, вы увидите, что он правильно прочитан.
Вместо того, чтобы пытаться использовать time.sleep()
, лучше использовать абсолютное время. Таким образом, идея состоит в том, чтобы взять ваше время начала и добавить три часа к нему. Затем вы можете продолжать цикл до тех пор, пока не будет достигнут finish_time
.
Тот же подход может быть применен к распределению вызовов API. Держите счетчик, показывающий, сколько звонков у вас осталось, и уменьшите его. Если он достигает 0
, прекратите звонить, пока не будет достигнут следующий пятнадцатиминутный интервал.
timedelta()
может использоваться для добавления минут или часов к существующему объекту datetime
. Делая это таким образом, ваше время никогда не выйдет из синхронизации.
Следующее показывает симуляцию того, как вы можете заставить вещи работать. Вам просто нужно добавить свой код, чтобы получить твиты:
from datetime import datetime, timedelta
import time
import csv
import random # just for simulating a random ID
fifteen = timedelta(minutes=15)
finish_time = datetime.now() + timedelta(hours=3)
calls_allowed = 450
calls_remaining = calls_allowed
now = datetime.now()
next_allocation = now + fifteen
todays_date = now.strftime("%d_%m_%Y")
ids_seen = set()
with open(f'tweets_{todays_date}.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
while now < finish_time:
time.sleep(2)
now = datetime.now()
if now >= next_allocation:
next_allocation += fifteen
calls_remaining = calls_allowed
print("New call allocation")
if calls_remaining:
calls_remaining -= 1
print(f"Get tweets - {calls_remaining} calls remaining")
# Simulate a tweet response
id = random.choice(["1111", "2222", "3333", "4444"]) # pick a random ID
date = "01.01.2019"
user = "Fred"
bio = "I am Fred"
text = "Hello, this is a tweet\nusing a comma and a newline."
if id not in ids_seen:
csv_output.writerow([id, date, user, bio, text])
ids_seen.add(id)
Что касается проблемы продолжения написания одних и тех же твитов. Вы можете использовать set()
для хранения всех идентификаторов, которые вы написали. Затем вы можете проверить, был ли новый твит уже просмотрен, прежде чем писать снова.