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
dbow
V2EX  ›  Python

windows 下 python 文件编码的问题

  •  
  •   dbow ·
    maliubiao · 2014-10-24 08:37:42 +08:00 · 4573 次点击
    这是一个创建于 3692 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用open("test.jpg", "w+"), 在windows下二进制流会乱掉,jpg损坏.
    这个对于习惯于linux的真是个坑, 改成wb+就能兼容了。
    22 条回复    2014-10-24 21:45:47 +08:00
    Delbert
        1
    Delbert  
       2014-10-24 08:40:40 +08:00 via Android
    b是二进制。
    我觉得这个不是问题……
    dbow
        2
    dbow  
    OP
       2014-10-24 08:48:56 +08:00
    @Delbert 确实是问题,我刚遇到的, 不加b图片就乱码。
    limbo0
        3
    limbo0  
       2014-10-24 08:57:26 +08:00   ❤️ 1
    加个b
    dbow
        4
    dbow  
    OP
       2014-10-24 09:00:57 +08:00
    @limbo0 在linux下面不加b也正常,这就是个不完全跨平台的例子。
    Delbert
        5
    Delbert  
       2014-10-24 09:03:24 +08:00 via Android
    @dbow 我的意思是 t才可以缺省的吧?
    图片本身是二进制编码的,所以需要b参数。

    https://docs.python.org/3/library/functions.html?highlight=open#open

    官方文档说t是缺省的,需要二进制的实习需要用b参数。

    所以这个不是编码问题。应该说不加b是你编程的bug
    吧……
    dbow
        6
    dbow  
    OP
       2014-10-24 09:06:33 +08:00
    @Delbert 主要是说在linux下可以不加,在windows下一定得加,这两个是不同的。
    timonwong
        7
    timonwong  
       2014-10-24 09:09:48 +08:00   ❤️ 4
    the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.)

    习惯Linux的也需要看看man吧
    zhouzm
        8
    zhouzm  
       2014-10-24 09:09:53 +08:00
    楼主对跨平台的期望值太高了,有时候还是需要你针对平台作些特殊处理的,这和 python 的跨平台能力无关。
    clino
        9
    clino  
       2014-10-24 09:16:51 +08:00
    这哪里是文件编码的问题,明明是你的问题...
    dbow
        10
    dbow  
    OP
       2014-10-24 09:20:24 +08:00
    @clino 我期望python能让内置函数在在windows下与linux下的行为完全一致的。
    clino
        11
    clino  
       2014-10-24 09:37:55 +08:00 via Android
    @dbow 好吧,这部分应该是因为c实现的不一致导致的
    Jaylee
        12
    Jaylee  
       2014-10-24 10:12:57 +08:00
    水平问题
    kidlj
        13
    kidlj  
       2014-10-24 10:32:38 +08:00 via Android
    在小学时候你不做作业就能考100分,到了初中再这样干只能考70分,所以是你的问题,还是中学的问题,或者是小学的问题?
    happywowwow
        14
    happywowwow  
       2014-10-24 10:36:28 +08:00
    我也觉得这应该是LZ的问题 不是python的问题
    不然应该是linux下w+图片也是乱码
    dbow
        15
    dbow  
    OP
       2014-10-24 10:55:22 +08:00
    @Jaylee @kidlj @happywowwow 我重点是说open在windows与linux下行为是不一致的, 二者有差所以是个坑, 讨论到此为止,不然又要成水贴了。
    VYSE
        16
    VYSE  
       2014-10-24 11:26:12 +08:00
    首先在Windows下,不加b会translate \n到\r\n,加b则不translate,应用场景下有人需要translate(因为也有人会觉得一段hello world!\n在Windows下还得加个\r?),也有人不需要translate(\n就是\n)。那如果Python统一了平台间差异,统一不translate binary模式,那又有人抱怨为啥Python没处理hello world\n的平台差异了。
    dbow
        17
    dbow  
    OP
       2014-10-24 12:55:34 +08:00
    @VYSE 补充一点,实现上python不转换这个,fileobject的write方法调用fwrite, 是底层的C运行时搞的。
    VYSE
        18
    VYSE  
       2014-10-24 13:04:33 +08:00 via Android
    @dbow 所以既然用了libc,python的open和c里的fopen保持一致也没有问题。open函数平台差异只能靠开发者来控制。
    onlyice
        19
    onlyice  
       2014-10-24 16:25:46 +08:00
    @VYSE 终于知道 Windows 下加不加 b 的区别了,感谢已发
    jun4rui
        20
    jun4rui  
       2014-10-24 17:59:06 +08:00 via Android
    dbow
        21
    dbow  
    OP
       2014-10-24 17:59:52 +08:00
    @jun4rui 啥?
    musics
        22
    musics  
       2014-10-24 21:45:47 +08:00
    区别楼上已经说了,部分POSIX 不用加也不影响是因为\n还是\n,但是WINODWS不同\n要转换成\r\n,在C这部分,一直是建议读取bin就加b.还是养成 好习惯根据MAN的建议来。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5935 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.