不断更新文件

时间:2016-06-14 17:58:18

标签: python unix

我有一个文件,其中包含我拥有的每种水果的数量。然后我需要每分钟编辑一次以使其保持最新状态。

apples: 3
bananas: 6
oranges: 12
total: 21 fruits

我想用python编辑这个文件。但是,我遇到了几个问题:

1)我目前正在使用以下来进行读/写。

with open(file, 'r') as infile:
    # read fruits that I have
infile.close()
with open(file, 'w') as outfile:
    while True:
        # update data and write to file 
outfile.close()

是否有更好/更有效的方法(没有内存映射)。我尝试使用f.seek(offset,from_what),但这有它自己的问题(如果苹果从1位数转到2位数,它会抛出文件的其余部分)。

2)我如何看待它正在发生变化?我试着做“tail -f”但是我正在编辑文件的方式会附加整个新文件。

3)当我进入while时,我一直在编辑文件,所以每当我尝试cat或vim文件时,它都是不完整的!理想情况下,我打开文件,我可以完整地看到该文件,并看到它更新。

感谢阅读!

2 个答案:

答案 0 :(得分:1)

您可以使用' w +'或者' r +'模式读写。当您在文本模式下打开文件时,默认情况下它是完全缓冲的。要查看实时更新,您必须flush每次写入或以行缓冲模式(buffering=1)打开文件。
此外,您无法使用tail -f,因为该文件未被追加。要观看实时更新,您必须反复拨打cat,这样watch cat fruits.txt即可。

我在这里模拟了你的情景。

from time import sleep

fruits = dict(apple=1, banana=2, orange=3)
with open('fruits.txt', 'w+', buffering=1) as f:
    for _ in range(20):
        for fruit, count in fruits.items():
            f.write('{}: {}\n'.format(fruit, count))

        f.seek(0)
        for line in f:
            line = line.strip().split(':')
            line[1] = int(line[1]) + 1
            fruits.update((line,))
        f.seek(0)
        sleep(1)

答案 1 :(得分:0)

您最好的选择是读入文件并将结果数量解析为变量。然后做你的数学(添加3个苹果或其他),然后重写文件。

你可以用一本字典做到最好,其中的键是你的水果名称,值是水果的数量。只需编写一个函数来提取文件并填写字典,然后用数学更新字典,然后编写一个函数,以您希望的格式将字典写入文件。这应该相对简单。