请教一个 Python 写入文件的问题,几个小时了,解决不了,求助各位大佬

2019-11-09 10:05:12 +08:00
 37Y37
代码如下:

```python
def record(self, data):
iodata = [time.time() - self.time, 'o', data]
with open(RECORD_DIR + self.filename, 'ab', buffering=0) as f:
print((json.dumps(iodata)))
f.write((json.dumps(iodata) + '\n').encode('utf-8'))
```

简化过的代码如上,可能每一毫秒都会调用 record 数次追加写入数据到文件

print 打印数据一切正常,大概如下



而 f.write 就会有一部分数据丢失(格式不对了,每一行都应该是一个 list)



起初是直接用的 a 模式,f.write(json.dumps(iodata) + '\n')这样的,有问题,怀疑是 buffer 的问题,所以添加了参数 buffeering=0,因为只有字节流才能用 buffering=0,所以这里改成了 ab 模式,同时 encode 了 json

还尝试过 f.writelines 和强制加了个 f.close 一样无法解决,求助各位大神
3550 次点击
所在节点    Python
7 条回复
shm7
2019-11-09 10:14:10 +08:00
1ms 不到写一次,io 如此密集,就没想过文件保持打开么? write 和 print 的不一样 print 有个啥用?搞个错例子调试一下试试就能知道是不是单纯 write 的锅。

槽点太多了,各种+,估计大家看不上所以懒得留言
37Y37
2019-11-09 10:17:18 +08:00
@shm7 感谢大佬留言,保持文件打开,使用队列,我都有考虑,抛去技术方案不讲,想知道这个究竟是什么问题,我有尝试,print 和 write 的参数一模一样,还是同样的问题
j0hnj
2019-11-09 10:17:57 +08:00
有多线程吗?
37Y37
2019-11-09 10:20:31 +08:00
@j0hnj 一语点醒梦中人,还真的有多线程,感谢大佬,大概率线程的问题,万分感谢
shm7
2019-11-09 10:21:16 +08:00
@37Y37 可能就不是这函数的毛病啊。读写很多,有没有想到过文件是否被锁住,是不是线程安全的。砖没抛好。。。这都要实验,明白不
12tall
2019-11-09 10:27:14 +08:00
看到乱序 第一感觉就是多线程
37Y37
2019-11-09 11:35:01 +08:00
@j0hnj
@12tall
感谢两位大佬,还是自己太菜,感谢两位

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/617826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX