我有一个文件,其中包含我拥有的每种水果的数量。然后我需要每分钟编辑一次以使其保持最新状态。
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文件时,它都是不完整的!理想情况下,我打开文件,我可以完整地看到该文件,并看到它更新。
感谢阅读!
答案 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个苹果或其他),然后重写文件。
你可以用一本字典做到最好,其中的键是你的水果名称,值是水果的数量。只需编写一个函数来提取文件并填写字典,然后用数学更新字典,然后编写一个函数,以您希望的格式将字典写入文件。这应该相对简单。