windows 下 python 文件编码的问题

2014-10-24 08:37:42 +08:00
 dbow
用open("test.jpg", "w+"), 在windows下二进制流会乱掉,jpg损坏.
这个对于习惯于linux的真是个坑, 改成wb+就能兼容了。
4406 次点击
所在节点    Python
22 条回复
Delbert
2014-10-24 08:40:40 +08:00
b是二进制。
我觉得这个不是问题……
dbow
2014-10-24 08:48:56 +08:00
@Delbert 确实是问题,我刚遇到的, 不加b图片就乱码。
limbo0
2014-10-24 08:57:26 +08:00
加个b
dbow
2014-10-24 09:00:57 +08:00
@limbo0 在linux下面不加b也正常,这就是个不完全跨平台的例子。
Delbert
2014-10-24 09:03:24 +08:00
@dbow 我的意思是 t才可以缺省的吧?
图片本身是二进制编码的,所以需要b参数。

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

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

所以这个不是编码问题。应该说不加b是你编程的bug
吧……
dbow
2014-10-24 09:06:33 +08:00
@Delbert 主要是说在linux下可以不加,在windows下一定得加,这两个是不同的。
timonwong
2014-10-24 09:09:48 +08:00
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
2014-10-24 09:09:53 +08:00
楼主对跨平台的期望值太高了,有时候还是需要你针对平台作些特殊处理的,这和 python 的跨平台能力无关。
clino
2014-10-24 09:16:51 +08:00
这哪里是文件编码的问题,明明是你的问题...
dbow
2014-10-24 09:20:24 +08:00
@clino 我期望python能让内置函数在在windows下与linux下的行为完全一致的。
clino
2014-10-24 09:37:55 +08:00
@dbow 好吧,这部分应该是因为c实现的不一致导致的
Jaylee
2014-10-24 10:12:57 +08:00
水平问题
kidlj
2014-10-24 10:32:38 +08:00
在小学时候你不做作业就能考100分,到了初中再这样干只能考70分,所以是你的问题,还是中学的问题,或者是小学的问题?
happywowwow
2014-10-24 10:36:28 +08:00
我也觉得这应该是LZ的问题 不是python的问题
不然应该是linux下w+图片也是乱码
dbow
2014-10-24 10:55:22 +08:00
@Jaylee @kidlj @happywowwow 我重点是说open在windows与linux下行为是不一致的, 二者有差所以是个坑, 讨论到此为止,不然又要成水贴了。
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
2014-10-24 12:55:34 +08:00
@VYSE 补充一点,实现上python不转换这个,fileobject的write方法调用fwrite, 是底层的C运行时搞的。
VYSE
2014-10-24 13:04:33 +08:00
@dbow 所以既然用了libc,python的open和c里的fopen保持一致也没有问题。open函数平台差异只能靠开发者来控制。
onlyice
2014-10-24 16:25:46 +08:00
@VYSE 终于知道 Windows 下加不加 b 的区别了,感谢已发
jun4rui
2014-10-24 17:59:06 +08:00

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

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

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

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

© 2021 V2EX