【发布时间】:2019-03-08 12:18:47
【问题描述】:
我目前正在尝试找到一种方法,让一个线程在文件中写入日志,另一个线程读取日志并处理它们。我发现a way(第 5 部分)可以连续读取文件中的数据,但是在将文件写入数据时确实存在问题。
当我尝试在文件中写入内容时,我需要在之后关闭它,否则文件将保持空白。但是如果我关闭文件,我就无法再阅读它了。 所以我的阅读线程看起来像这样:
def follow(file):
file.seek(0,0)
while True:
line = file.readline()
if not line:
time.sleep(0.1)
continue
yield line
file = open(self.path)
loglines = follow(self.file)
for line in loglines:
print(line)
但是要写,我使用了类似的东西:
file = open(self.path, 'w')
file.write(self.generateLog())
file.close()
sleep(self.duration)
但是,一旦调用 file.close(),我的阅读部分就会出错:
line 38, in run
for line in loglines:
line 147, in follow
line = file.readline()
ValueError: I/O operation on closed file.
但是如果我在写入后不关闭文件,它就永远不会更新。 (我只是在写部分以确保读取部分正常工作。理论上,日志文件将由 apache 或其他东西更新)。
编辑:感谢flush(),我不再有这个问题了,非常感谢! 但似乎写作和阅读都很难。如果我打印我写的那一行,我读到的那一行,我会得到类似的东西:
Writing : 158.228.210.37 [...] "GET /cat/rzkpvwons HTTP/1.0" 505 1119
Reading : 5 1119
所以读取不会读取整行。知道这个问题吗?
EDIT2:只是将 open(path,'w') 更改为 open(path,'a+') 似乎与冲洗结合使用,应该早点考虑到这一点。 非常感谢!
非常感谢, 贾兹
【问题讨论】:
-
"当我尝试在文件中写入内容时,我需要关闭它,否则文件将保持空白。" 也许
.flush()会帮助你。不知道能不能解决你所有的问题。 -
非常感谢!我猜它确实解决了部分问题。但是,我面临着一个新的(见编辑)。再次感谢
标签: python python-3.x io