阅读不断增长的文件

时间:2014-03-10 09:24:51

标签: python

我运行了命令PROGRAM 2> log.txt

它将连续将输出写入log.txt。

并且输出将在同一行,因为每个输出最后只有\r

我正试图以这种方式阅读log.txt,truncate清除我读过的数据。

    read_in_file = open(in_file, 'r')
    records = []
    for new_item in self.__get_matched_line(read_in_file):
        records.append(new_item)

    read_in_file.truncate()
    read_in_file.close()
    return records

但它有一些问题,我有时会得到已读数据。

该程序可能会持续数周。并且每0.5秒输出一次

1 个答案:

答案 0 :(得分:0)

您的PROGRAM将在输出文件上打开一个文件句柄;因此,即使您从外部截断文件,无论文件被截断如何,文件句柄都将写入其旧位置。结果将是截断前的原始长度文件(间隙用零填充,如果选择此路径,可以阅读稀疏文件以获取更多详细信息)。你可以通过关闭文件句柄并为每一行重新打开它来绕过它。最好在PROGRAM内完成。如果你不能改变它,你可以逐行阅读(由'\r'分隔)并将整行附加到你的日志文件中:

PROGRAM |& while IFS= read -e -d $'\r' line; do echo "$line" >> log.txt; done

如果您真的只希望以这种方式记录stderr,请使用以下模式:

(PROGRAM 2>&1 1>&3 | while IFS= read -e -d $'\r' line; do echo "$line" >> log.txt; done) 3>&1

这样,日志文件中的truncate将具有所需的效果。

但请注意,使用truncate只会在保留开头的同时从文件的 end 中删除内容。如果只使用一个文件,则在删除开头时无法保持结束。因此,如果截断整个文件(将其设置为0字节),则使用truncate删除已读取的部分是有意义的。

因此,您可能需要考虑日志轮换。这是一个定义明确的过程,可能比你的方法有优势(并且只有有设施已经为你做了)。