如何从流中附加到文件而不是在Python中覆盖

时间:2016-08-21 21:05:07

标签: python file stream message

我是python的新手,所以这可能是一个简单的问题,但我有一个kafka消费者,我从中读取消息。每次收到新消息时,它都会将之前的消息重写为order.json文件,但是我想要添加它。另外,我想确保消息不会以每1秒钟的速度读取,并且可能会暂停某些操作。任何有关如何做到这一点的提示将非常感激。这是我目前的代码

for message in consumer:
     with open('order.json', 'w') as file:
          file.write(message.value.decode('UTF-8'))

3 个答案:

答案 0 :(得分:0)

在循环外打开:

with open('order.json', 'w') as file:
    for message in consumer:         
          file.write(message.value.decode('UTF-8'))

或者在外面打开并使用a如果您要为每次运行添加:

with open('order.json', 'a') as file:
    for message in consumer:         
          file.write(message.value.decode('UTF-8'))

答案 1 :(得分:0)

您想在append mode中打开文件。此外,您可能不希望在每条消息上打开文件,因为它可能是一项昂贵的操作(例如,每次关闭文件时,您都需要更改文件元数据,如修改时间):

# open file in append mode, once
with open('order.json', 'a') as file:
    for message in consumer:
        file.write(message.value.decode('UTF-8'))

至于速率限制,你可以从简单的东西开始,如下所示:

import time

def ratelimit(it, sleep=1.0):
    for v in it:
        yield v
        time.sleep(sleep)

if __name__ == '__main__':
    for i in ratelimit(range(10)):
        print(i)

这将确保迭代器的连续值之间存在至少一秒的延迟。这是一个显示速率限制器的asciicast

答案 2 :(得分:0)

append模式打开文件' w'(写入模式)每次文件都会截断文件

for message in consumer:
    with open('order.json', 'a') as file:
        file.write(message.value.decode('UTF-8'))