V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
37Y37
V2EX  ›  Python

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

  •  
  •   37Y37 · 2019-11-09 10:05:12 +08:00 · 3534 次点击
    这是一个创建于 1845 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下:

    ```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 一样无法解决,求助各位大神
    7 条回复    2019-11-09 11:35:01 +08:00
    shm7
        1
    shm7  
       2019-11-09 10:14:10 +08:00 via iPhone
    1ms 不到写一次,io 如此密集,就没想过文件保持打开么? write 和 print 的不一样 print 有个啥用?搞个错例子调试一下试试就能知道是不是单纯 write 的锅。

    槽点太多了,各种+,估计大家看不上所以懒得留言
    37Y37
        2
    37Y37  
    OP
       2019-11-09 10:17:18 +08:00
    @shm7 感谢大佬留言,保持文件打开,使用队列,我都有考虑,抛去技术方案不讲,想知道这个究竟是什么问题,我有尝试,print 和 write 的参数一模一样,还是同样的问题
    j0hnj
        3
    j0hnj  
       2019-11-09 10:17:57 +08:00 via iPhone
    有多线程吗?
    37Y37
        4
    37Y37  
    OP
       2019-11-09 10:20:31 +08:00
    @j0hnj 一语点醒梦中人,还真的有多线程,感谢大佬,大概率线程的问题,万分感谢
    shm7
        5
    shm7  
       2019-11-09 10:21:16 +08:00 via iPhone
    @37Y37 可能就不是这函数的毛病啊。读写很多,有没有想到过文件是否被锁住,是不是线程安全的。砖没抛好。。。这都要实验,明白不
    12tall
        6
    12tall  
       2019-11-09 10:27:14 +08:00
    看到乱序 第一感觉就是多线程
    37Y37
        7
    37Y37  
    OP
       2019-11-09 11:35:01 +08:00
    @j0hnj
    @12tall
    感谢两位大佬,还是自己太菜,感谢两位
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3841 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:07 · PVG 13:07 · LAX 21:07 · JFK 00:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.