python文件二进制打开模式_文本模式与二进制模式打开文件对比

问题是在用Python抓取一个网站上的图片时出现的,代码如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import urllib2

img="https://www.baidu.com/img/bdlogo.png"

imgdata=urllib2.urlopen(img).read()

png=open("logo.png","w")

png.write(imgdata)

png.close()

发现下载来下的图片已经损坏,无法被打开。对两张图片进行hash运算,发现内容确实发生了改变,大小也由原来的5331字节变成了5345字节,用二进制查看器进行查看,发现第6个字节由原来的0x0a变成了0x0d。经过细致对于分析,发现新文件在所有的0x0a之前都添加了0x0d这个字节。熟悉ASCII码表的可能知道,0d0a代表是回车换行,通常在windows下表示新的一行开始,同样的代码放到linux下,发现下载图片完全正常,而linux下换成则是0x0a,这里推测由于文件是文本方式打开的,所以程序自动在0x0a前增加了0x0d,殊不知更改了原来的数据导致图片打不开(这点非常像windows自作聪明的给utf-8编码的文件自动加上BOM)。

open-mode-300x172.jpg

那么,针对这种二进制数据,python如何处理呢?Python打开模式中提供了一个”b”参数,表示用二进制方式打开,并对b模式做了如下说明:

On Windows, ‘b’ appended to the mode opens the file in binary mode, so there are also modes like ‘rb’, ‘wb’, and ‘r+b’. Python on Windows makes a distinction between text and binary files; the end-of-line characters in text files are automatically altered slightly when data is read or written. This behind-the-scenes modification to file data is fine for ASCII text files, but it’ll corrupt binary data like that in JPEG or EXE files. Be very careful to use binary mode when reading and writing such files. On Unix, it doesn’t hurt to append a ‘b’ to the mode, so you can use it platform-independently for all binary files.

上面的情况是对文件进行写操作,如果是对文件进行读操作,会发现fileformat=dos的文件,在windows下用”r”模式进行打开,python会自动去掉0x0d,而linux平台则不会。

综上,我们可以理解python中的b模式主要是针对在windows下换成和unix平台不一样而采用的兼容性举措,在unix平台下,用不用‘b’模式不影响处理的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值