open函数可以打开一个文件。超级简单吧?大多数时候,我们看到它这样被使用:

f = open('photo.jpg', 'r+')

jpgdata = f.read()

f.close()

我现在写这篇文章的原因,是大部分时间我看到open被这样使用。有三个错误存在于上面的代码中。你能把它们全指出来吗?如不能,请读下去。在这篇文章的结尾,你会知道上面的代码错在哪里,而且,更重要的是,你能在自己的代码里避免这些错误。现在我们从基础开始:

open的返回值是一个文件句柄,从操作系统托付给你的Python程序。一旦你处理完文件,你会想要归还这个文件句柄,只有这样你的程序不会超出一次能打开的文件句柄的数量上限。

显式地调用close关闭了这个文件句柄,但前提是只有在read成功的情况下。如果有任意异常正好在f = open(...)之后产生,f.close()将不会被调用(取决于Python解释器的做法,文件句柄可能还是会被归还,但那是另外的话题了)。为了确保不管异常是否触发,文件都能关闭,我们将其包裹成一个with语句:

with open('photo.jpg', 'r+') as f:

jpgdata = f.read()

open的第一个参数是文件名。第二个(mode打开模式)决定了这个文件如何被打开。

如果你想读取文件,传入r

如果你想读取并写入文件,传入r+

如果你想覆盖写入文件,传入w

如果你想在文件末尾附加内容,传入a

虽然有若干个其他的有效的mode字符串,但有可能你将永远不会使用它们。mode很重要,不仅因为它改变了行为,而且它可能导致权限错误。举个例子,我们要是在一个写保护的目录里打开一个jpg文件, open(.., 'r+')就失败了。mode可能包含一个扩展字符;让我们还可以以二进制方式打开文件(你将得到字节串)或者文本模式(字符串)

一般来说,如果文件格式是由人写的,那么它更可能是文本模式。jpg图像文件一般不是人写的(而且其实不是人直接可读的),因此你应该以二进制模式来打开它们,方法是在mode字符串后加一个b(你可以看看开头的例子里,正确的方式应该是rb)。

如果你以文本模式打开一些东西(比如,加一个t,或者就用r/r+/w/a),你还必须知道要使用哪种编码。对于计算机来说,所有的文件都是字节,而不是字符。

可惜,在Pyhon 2.x版本里,open不支持显示地指定编码。然而,io.open函数在Python 2.x中和3.x(其中它是open的别名)中都有提供,它能做正确的事。你可以传入encoding这个关键字参数来传入编码。

如果你不传入任意编码,一个系统 - 以及Python -指定的默认选项将被选中。你也许被诱惑去依赖这个默认选项,但这个默认选项经常是错误的,或者默认编码实际上不能表达文件里的所有字符(这将经常发生在Python 2.x和/或Windows)。

所以去挑选一个编码吧。utf-8是一个非常好的编码。当你写入一个文件,你可以选一个你喜欢的编码(或者最终读你文件的程序所喜欢的编码)。

那你怎么找出正在读的文件是用哪种编码写的呢?好吧,不幸的是,并没有一个十分简单的方式来检测编码。在不同的编码中,同样的字节可以表示不同,但同样有效的字符。因此,你必须依赖一个元数据(比如,在HTTP头信息里)来找出编码。越来越多的是,文件格式将编码定义成UTF-8。

有了这些基础知识,我们来写一个程序,读取一个文件,检测它是否是JPG(提示:这些文件头部以字节FF D8开始),把对输入文件的描述写入一个文本文件。

import io

with open('photo.jpg', 'rb') as inf:

jpgdata = inf.read()

if jpgdata.startswith(b'\xff\xd8'):

text = u'This is a JPEG file (%dbytes long)\n'

else:

text = u'This is a random file (%dbytes long)\n'

with io.open('summary.txt', 'w', encoding='utf-8') as outf:

outf.write(text % len(jpgdata))

我敢肯定,现在你会正确地使用open啦!

python的open函数百度百科,open函数相关推荐

  1. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  2. python 爬取百度知道,Python 爬虫爬取百度百科网站

    利用python写一个爬虫,爬取百度百科的某一个词条下面的全部链接和每一个链接内部的词条主题和摘要.利用request库爬取页面,然后利用BeautifulSoup对爬取到的页面提取url和关键内容. ...

  3. python迭代器是什么百度百科,python迭代器的接口是什么?

    What are the required methods for defining an iterator? For instance, on the following Infinity iter ...

  4. python爬取百度百科表格_第一个python爬虫(python3爬取百度百科1000个页面)

    以下内容参考自:http://www.imooc.com/learn/563 一.爬虫简介 爬虫:一段自动抓取互联网信息的程序 爬虫可以从一个url出发,访问其所关联的所有的url.并从每个url指向 ...

  5. python 百度百科 爬虫_爬虫爬取百度百科数据

    以前段时间<青春有你2>为例,我们使用Python来爬取百度百科中<青春有你2>所有参赛选手的信息. 什么是爬虫? 为了获取大量的互联网数据,我们自然想到使用爬虫代替我们完成这 ...

  6. 【自然语言处理概述】百度百科数据爬取

    [自然语言处理概述]百度百科数据爬取 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设专家委员会(TIPC ...

  7. c语言frequency函数,frequency_Excel中frequency函数怎么用

    Excel中frequency函数怎么用 FREQUENCY 函数 计算数值在某个区域内的出现频率,然后返回一个垂直数组. 例如,使用函数 FREQUENCY 可以在分数区域内计算测验分数的个数. 由 ...

  8. matlab匿名函数方式定义函数,在matlab中定义函数添加@(x)——匿名函数

    f=@(x)acos(x) 表示 f 为函数句柄,@是定义句柄的运算符.f=@(x)acos(x) 相当于建立了一个函数文件:% f.mfunction  y=f(x)y=acos(x); @是匿名函 ...

  9. 使用python爬虫爬取秒懂百科的视频

    仅供学习交流使用,如有侵权,联系删除. python 爬虫抓取百度百科视频源代码 from urllib.parse import quote from bs4 import BeautifulSou ...

最新文章

  1. Vue 单文件组件||Vue 单文件组件的基本用法||webpack 中配置 vue 组件的加载器|| 在 webpack 项目中使用 vue
  2. php 真实访问次数,PHP将访问次数写入文件下
  3. 02- Image Terminology
  4. java的开源项目哪里找,我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)...
  5. spring— Bean标签scope配置和生命周期配置
  6. pca图像压缩python_基于PCA的图像降维及图像重构
  7. mysql innodb数据结构_Mysql InnoDB数据结构
  8. 从零学React Native之01创建第一个程序
  9. 一个数根号3怎样用计算机计算,根号3等于多少怎么算
  10. linux系统查看内核版本是多少,在linux下查看内核版本、gcc版本、操作系统多少位等参数...
  11. Termux基础教程(无编程基础动图展示版)
  12. 3台服务器+StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机
  13. 七牛云陈超受邀出席杭州西商大会,共话数字时代未来
  14. 免费售后——公司办公电脑配置单2500到4500档(包含显示器)
  15. 【IoT】NFC 之 Type A 与 TYpe B 卡区别
  16. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决
  17. Android开发整理
  18. 2019年一定要去缅甸看一看,景色美到让人哭
  19. 中年技术人,如何对抗内心的焦虑与孤独?
  20. [转]ubuntu 安装code blocks全记录

热门文章

  1. 2.2物理层传输介质
  2. AdaBoost 算法 入门
  3. MFC关键技术-命令传递机制
  4. 【剑指offer】面试题57:和为s的两个数字(Java)
  5. python实现采样函数_python中resample函数实现重采样和降采样代码
  6. jq获取id的名称_查找 Linux 发行版名称、版本和内核详细信息 | Linux 中国
  7. 中科院大学计算机研究生考试大纲,中国科学院大学《计算机原理》2019年硕士研究生入学考试大纲...
  8. c语言字符数组不写,C语言数组
  9. OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
  10. JBU联合双边上采样