如何创建不包含早于 5 分钟的信息的文件?
How do I create a file that doesn't contain information older than 5 minutes?
我正在使用 Twitter Streaming api 来获取实时推文数据。
我可以将该数据打印到控制台。但我想要的是将数据保存到一个文件中,并且该数据不应超过 5 分钟。
如何像对日志文件那样连续滚动包含过去 5 分钟数据的文件。
同时文件应该可以读取。
在 Python 中有什么方法可以做到这一点吗?
我还没有遇到过这样的事情,我们可以提到文件可以保存特定数据的持续时间。
将数据保存在一个文件中,包含实际时间并检查实际时间是否相差 5 分钟。使用时间。或者使用睡眠功能,每 5 分钟清除一次旧数据。
这应该可以帮助您入门。只要它的年龄超过 300 秒,它就会从列表中删除推文。
import time;
TIME_LIMIT = 300; # 5 mins in seconds
# Get the tweet text and the time stamp
def GetTweet():
#...
# Wait until there is a new tweet from Donald :)
text = 'your function that gets the text goes here';
# Get the time stamp
time_ = time.time();
return text, time_
# Kill all the old data that is older than X seconds
def KillOldTweet(tweets):
time_now = time.time(); # Capture the current time
# For every tweet stored remove the old one
for i, tweet in enumerate(tweets):
time_diff = time_now - tweet[1]; # get the time difference
if time_diff > TIME_LIMIT: # if older than X secods, kill that tweet from the list
tweets.pop(i);
pass;
pass;
return tweets; # return the list
# Updates the file with the list of text of tweets
def UpdateFile(tweets):
with open('output.txt', 'w') as file: # open the file and close it after writing
texts = [ i for i, j in tweets ]; # unzip;
out_text = str(texts); # convert to string
print(out_text); #
file.write(out_text); # overwrite to file
pass;
pass;
tweets = [];
while(1):
# Get the new tweet and append to the list
text, time_ = GetTweet(); # Wait until a new tweet arrived
tweet = (text, time_); # zip it into a tuple
tweets.append(tweet); # append it to list
# Kill the old tweets from the list
tweets = KillOldTweet(tweets)
# Update the file with the fresh tweets
UpdateFile(tweets);
# Sleep for 1 second.
time.sleep(1);
pass;
但我建议您使用套接字模块而不是写入文本文件。或者使用 pickle 模块从文件中轻松解压内容
搜索 "python logrotate" 发现:https://docs.python.org/3.7/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler。
可能值得一试。
如果您更愿意自己编写代码,管理内存中的推文(例如使用 collections.deque
,这样很容易弹出旧推文并添加新推文),然后将其刷新到文件中一次while...,(或使用套接字、泡菜、简单的变量名将此数据传递给您的分析函数,正如其他答案中已经提到的那样)。
我正在使用 Twitter Streaming api 来获取实时推文数据。
我可以将该数据打印到控制台。但我想要的是将数据保存到一个文件中,并且该数据不应超过 5 分钟。
如何像对日志文件那样连续滚动包含过去 5 分钟数据的文件。
同时文件应该可以读取。
在 Python 中有什么方法可以做到这一点吗?
我还没有遇到过这样的事情,我们可以提到文件可以保存特定数据的持续时间。
将数据保存在一个文件中,包含实际时间并检查实际时间是否相差 5 分钟。使用时间。或者使用睡眠功能,每 5 分钟清除一次旧数据。
这应该可以帮助您入门。只要它的年龄超过 300 秒,它就会从列表中删除推文。
import time;
TIME_LIMIT = 300; # 5 mins in seconds
# Get the tweet text and the time stamp
def GetTweet():
#...
# Wait until there is a new tweet from Donald :)
text = 'your function that gets the text goes here';
# Get the time stamp
time_ = time.time();
return text, time_
# Kill all the old data that is older than X seconds
def KillOldTweet(tweets):
time_now = time.time(); # Capture the current time
# For every tweet stored remove the old one
for i, tweet in enumerate(tweets):
time_diff = time_now - tweet[1]; # get the time difference
if time_diff > TIME_LIMIT: # if older than X secods, kill that tweet from the list
tweets.pop(i);
pass;
pass;
return tweets; # return the list
# Updates the file with the list of text of tweets
def UpdateFile(tweets):
with open('output.txt', 'w') as file: # open the file and close it after writing
texts = [ i for i, j in tweets ]; # unzip;
out_text = str(texts); # convert to string
print(out_text); #
file.write(out_text); # overwrite to file
pass;
pass;
tweets = [];
while(1):
# Get the new tweet and append to the list
text, time_ = GetTweet(); # Wait until a new tweet arrived
tweet = (text, time_); # zip it into a tuple
tweets.append(tweet); # append it to list
# Kill the old tweets from the list
tweets = KillOldTweet(tweets)
# Update the file with the fresh tweets
UpdateFile(tweets);
# Sleep for 1 second.
time.sleep(1);
pass;
但我建议您使用套接字模块而不是写入文本文件。或者使用 pickle 模块从文件中轻松解压内容
搜索 "python logrotate" 发现:https://docs.python.org/3.7/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler。 可能值得一试。
如果您更愿意自己编写代码,管理内存中的推文(例如使用 collections.deque
,这样很容易弹出旧推文并添加新推文),然后将其刷新到文件中一次while...,(或使用套接字、泡菜、简单的变量名将此数据传递给您的分析函数,正如其他答案中已经提到的那样)。