Python基础教程【读书笔记】 - 2016/8/3
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴!
第十一波:第11章 文件和素材
本章更进一步,让程序能够接触更多的领域:文件和流。接下来介绍的函数和对象可以让你在程序调用起见存储数据,并且可以处理来自其他程序的数据。
[11.1] 打开文件
open函数用来打开文件,语法如下:
open(name[,mode[,buffering]])
open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式mode和缓冲buffering参数都是可选的。
假设有一个名为somefile.txt的文本文件,其存储路径是c:\text,那么可以像下面这样打开文件。
>>>f=open(r'C:\text\somefile.txt')
稍后会介绍文件对象的用处,先来看看open函数的其他两个参数。
[11.1.1] 文件模式
如果open函数只带一个文件名参数,那么可以获得能读取文件内容的文件对象。如果要想文件内写入内容,则必须提供一个模式参数来显式的声明。open函数中的模式参数只有几个值,如下所示:
r 读模式
w 写模式
a 追加模式
b 二进制模型(可添加到其他模式中使用)
+ 读/写模式(可添加到其他模式中使用)
明确地制定读模式和什么模式参数都不用的效果是一样的。使用写模式可以像文件写入内容。‘+’参数可以用到其他任何模式中,致命读和写都是允许的。比如‘r+’能在打开一个文本文件用来读写时使用。
‘b’模式改变处理文件的方法,一般来说,Python假定处理的是文本文件(包含字符)。但是如果处理的是一些其他类型的文件(二进制文件),比如声音剪辑或者图像,那么应该在模式参数中增加‘b’。参数‘rb’可以用来读取一个二进制文件。
Python对于文本文件的操作方式令人惊讶,其中唯一要用到的技巧就是标准化换行符。一般来说,Python中换行符(\n)表示结束一行并另起一行,这也是UNIX系统中的规范。但在Windows中一行结束的标识是\r\n。为了在程序中隐藏这些区别,Python在这里做了一些自动转换:在windows下用文本模式读取文件中的文本时,Python将\r\n转换成\n。相反地,当在Windows下用文本模式向文件写文本时,Python会把\n转换成\r\n。
在使用二进制文件时可能会产生问题,因为文件中包含能被解释或前面提到的换行符的字节,而使用文本模式,Python自动转换,但是这样会破坏二进制数据,因此为了避免这样的事情发生,要使用二进制模式。
注意,通过在模式参数中使用U参数能够在打开文件时使用通用的换行符支持模式,在这种模式下,所有的换行符/字符串都被转换成\n,而不用考虑运行的平台。
11.1.2 缓冲
open函数的地3个参数(可选)控制着文件的缓冲。如果参数是0(或者是False),I/O就是无缓冲的(所有的读写操作都直接针对硬盘);如果是1(或者是True),I/O就是有缓冲的(意味着Python使用内存来代替硬盘,让程序更快,只有使用flush或close才会更新硬盘上的数据)。大于1的数字代表缓冲区的大小(单位是字节),-1(或者是任何负数)代表使用默认的缓冲区大小。
[11.2] 基本文件方法
打开文件的方法已经介绍了,下一步就是用它们做些有用的事。下面介绍文件对象(和一些类文件对象,有时称为流)的一些基本方法。类文件对象是支持一些文件的方法的对象,比如file方法,更重要的是支持read或write方法。那些有urllib.urlopen返回的对象是一个很好的例子。它们支持的方法由read、readline和readlines。
[11.2.1] 读和写
文件(或流)最重要的能力是提供或者接受数据,如果有一个名为f的类文件对象,那么就可以用f.write方法和f.read方法写入和读取数据。
每次调用f.write(string)时,所提供的参数string会被追加到文件中已存在的部分的后面。
>>>f=open('somefile.txt','w')
>>>f.write('hello.')
>>>f.write('world!')
>>>f.close()
在完成对一个文件的操作时,调用close。读取很简单,只要记得告诉流要读多少字符(字节)即可:
>>>f=open('somefile.txt','r')
>>>f.read(4)
'hell'
>>>f.read()
'o. world!'
首先制定了要读取的字符数4,然后(通过不提供要读取的字符串的方式)读取了剩下的文件。在调用open时可以省略模式说明,因为‘r’是默认的。
[11.2.2] 管式输出
在UNIX的shell中,使用管道可以在一个命令后面续写其他的多个命令,就像下面的例子:
$cat somefile.txt | python somescript.py | sort
这个管道pipeline由以下3个命令组成:
cat somefile.txt:只是把somefile.txt的内容写到标准输出(sys.stdout);
python somescript.py:这个命令运行了Python脚本somescript.py。脚本应该是从标准输入读,把结果写入到标准输出。
sort:从标准输入(sys.stdin)读取所有的文本,按字母排序,然后把结果写入标准输出。
管道符号(|)的作用是什么?
管道符号将一个命令的标准输出和下一个命令的标准输入连在一起。这样,就知道somescript会从它的sys.stdin中读取数据,并把结果写入它的sys.stdout中。
随机访问:本章内的例子把文件都当成流来操作---也就是说只能按照从头到尾的顺序读数据。实际上,在文件中随意移动读取位置也是可以的,可以使用类文件对象seek和tell来直接访问感兴趣的部分(这种做法称为随机访问):
seek(offset[.whence]):这个方法把当前位置(进行读和写的位置)移动到由offset定义的位置。whence.offset是一个字节数。whence默认是0,也就是说偏移量是从文件开头开始计算的。whence可能被设置为1(相对于当前位置的移动)或者2(相对于文件结尾的移动)。
[11.2.3] 读写行
通常逐个字符读取文件也是没有问题的,进行逐行的读取也可以。可以使用file.readline读取单独的一行(从当前的位置开始直到一个换行符出现,也读取这个换行符)。不使用任何参数(这样,一行就被读取和返回)或者使用一个非负的整数作为readline可以读取的字符的最大值。因此,如果someFile.readline()返回‘hello,world!\n’,someFile.readline(5)返回‘hello’。readlines方法可以读取一个文件中的所有行并将其作为列表返回。
writelines方法和readlines相反:传给它一个字符串的列表,它会把所有字符串写入文件。注意,程序不会增加新行,需要自己添加。
[11.2.4] 关闭文件
牢记使用close方法关闭文件。可以避免在某些操作系统或设置中进行无用的修改,这样做也会避免用完系统中所打开文件的配额。写入过的文件总是应该关闭的,是因为Python可能会缓存(出于效率的考虑而把数据临时地存储在某处)写入的数据。如果程序因为某些原因崩溃了,那么数据根本就不会被写入文件。为了安全起见,要在使用完文件后关闭。
# open your file here
try:
# write data to your file
finally:
file.close()
事实上,有专门为这种情况设计的语句,即with语句:
with open("somefile.txt") as somefile:
do_something(somefile)
with语句可以打开文件并且将其赋值到变量上,本例是somefile。之后可以将数据写入语句体中的文件。文件在语句结束后会被自动关闭,即使是由于异常引起的结束也是如此。
from __future__ import with_statement
在写入一些文件内容后,通常的想法是希望这些改变会立刻体现在文件中。这样一来其他读取这个文件的程序也能知道改变。难道不是这样吗?
不一定!数据可能被缓存了(在内存中临时性地存储),知道关闭文件才会被写入到文件。如果需要继续使用文件,又想将磁盘上的文件进行更新,以反映这些修改,那么就要调用文件对象的flush方法。
[11.2.5] 使用基本文件方法
假设somefile.txt包含如下内容,能对它进行什么操作?
首先是read(n):
f=open(r'c:\text\somefile.txt')
>>>f.read(4)
>>>print f.read()
>>>f.close()
接着是readline():
>>>for i in range(3):
print str(i)+': '+f.readline()
以及readlines():
>>>import pprint
>>>pprint.pprint(open(r'c:\text\somefile.txt').readlines())
下面是写文件,首先是write(str):
>>>f=open(r'c:\text\somefile.txt','w')
>>>f.write('this\nis no\nhaiku')
>>>f.close()
最后是writelines(list):
>>>f=open(r'c:\text\somefile.txt')
>>>lines=f.readlines()
>>>f.close()
>>>lines[1]="isn't a\n"
>>>f=open(r'c:\text\somefile.txt','w')
>>>f.writelines(lines)
>>>f.close()
[11.3] 对文件内容进行迭代
前面介绍了文件对象的一些文本对象提供的方法,以及如何获取这样的文件对象。对文件内容进行迭代以及重复执行一些操作,是最常见的文件操作之一。其中的一些技术是使用曾经见过的方法(如read、readline、readlines),另一些方法时即将介绍的(比如xreadlines和文件迭代器)。
def process(string):
print 'Processing:',string
[11.3.1] 按字节处理
最常见的对文件内容进行迭代的方法是在while循环中使用read方法。例如,对每个字符进行循环:
f=open(filename)
char=f.read(1)
while char:
process(char)
char=f.read(1)
f.close()
这个程序可以使用是因为当达到文件的末尾时,read方法返回一个空的字符串。但那之前返回的字符串会包含一个字符(这样布尔值为真)。改进版本代码如下:
f=open(filename)
while True:
char=f.read(1)
if not char:break
process(char)
f.close()
[11.3.2] 按行操作
当处理文本文件时,经常会对文件的行进行迭代而不是处理单个字符。处理行使用的方法和处理字符一样,即使用readline方法,代码如下:
f=open(filename)
while True:
line=f.readline()
if not line:break
process(line)
f.close()
[11.3.3] 读取所有内容
如果文件不是很大,那么可以使用不带参数的read方法一次读取整个文件,或者使用readlines。注意,将文件的内容读入一个字符串或者是读入列表在其他时候也很有用。如下代码:
f=open(filename)
for char in f.read():
process(char)
f.close()
for line in f.readlines():
process(line)
f.close()
[11.3.4] 使用fileinput实现懒惰行迭代
在需要对一个非常大得文件进行迭代行的操作是,readlines会占用太多的内存。可以使用for循环使用一个名为懒惰行迭代的方法,说它懒惰是因为它只是读取实际需要的文件部分。
import fileinput
for lin in fileinput.input(filename):
process(line)
在旧式代码中,可使用xreadlines实现懒惰行迭代。它的工作方式和readlines很类似,不同点在于,它不是讲全部的行读到列表中而是创建一个xreadlines对象。在自己的代码中最好用fileinput或文件迭代器。
[11.3.5] 文件迭代器
在Python的近几个版本中,文件对象是可迭代的。这就意味着可以直接在for循环中使用它们,从而对它们进行迭代。如下代码:
f=open(filename)
for line in f:
process(line)
f.close()
查看下面的例子:
>>>lines=list(open('somefile.txt'))
>>>lines
['first line','second line','third line']
>>>first,second,third=open('somefile.txt')
在这个例子中,注意下面的几点很重要:
使用print来向文件内写入内容,这会在提供的字符串后面增加新的行;
使用序列来对一个打开的文件进行解包操作,把每行都放入一个单独的变量中;
在写文件后关闭了文件,是为了确保数据被更新到硬盘。
[11.4] 小结
类文件对象:类文件对象支持read和readline方法的非正式对象。
打开和关闭文件:通过提供一个文件名,使用open函数打开一个文件。
模式和文件类型:当打开一个文件时,可以提供一个模式。
标准流:
读和写:使用read或是write方法对文件对象或类文件对象进行读写操作。
读写行:使用readline和readlines和xreadlines方法从文件中读取行,使用writelines可以吸入数据。
迭代文件内容
Python基础教程【读书笔记】 - 2016/8/3的更多相关文章
- 《Python基础教程读书笔记》
第1章 快速构造:基础知识 1.2交互式构造器 不强制分号,一行就是一行.可以加上分号 1.4数字和表达式 加.减.乘.除.整除.求余.指数.取反(-例如-2**2,**的优先级比-大) from _ ...
- Python基础教程 读书笔记(2)第二章 列表和元组
2.1序列概览 列表和元组的主要区别在于,列表可以修改,元组则不能.也就是说如果要根据要求来添加元素,那么列表可能会更好用;而出于某些原因,序列不能修改的时候,使用元组则更为合适.使用后者的理由通常是 ...
- SQL Server2012 T-SQL基础教程--读书笔记(1-4章)
SQL Server2012 T-SQL基础教程--读书笔记(1-4章) SqlServer T-SQL 示例数据库:点我 Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的 ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- SQL Server2012 T-SQL基础教程--读书笔记(5-7章)
SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5. ...
- Python基础教程学习笔记:第一章 基础知识
Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...
- 【学习笔记】Python基础教程学习笔记
教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...
- 【索引】Objective-C基础教程-读书笔记
第1章 启程 http://www.cnblogs.com/duxiuxing/p/5492219.html 第2章 对C的扩展 第3章 面向对象编程的基础知识 第4章 继承 第5章 复合 第6章 ...
- 《python基础教程》笔记之 异常
按自己的方式出错 使用raise语句引发一个异常,可以使用一个类(应该是Exception的子类)或者实例参数来作为raise的引发对象.使用类时,程序会自动创建实例,如 >>> r ...
- 《python基础教程》笔记之 序列通用操作
索引 序列中的所有元素都是有编号的--从0开始递增.使用负数索引时,Python会从右边,也就是从最后一个元素开始计数,最后一个元素的位置编号是-1.此外,字符串是一个有字符组成的序列,字符串字面值可 ...
随机推荐
- MySQL 添加列,修改列,删除列
创建后表的修改 alter table 语句用于创建后对表的修改, 基础用法如下: 添加列 基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置]; 示例: 在表 ...
- python 文件操作,seek, tell, name...
可以设置文件当前位置偏移 fileObject.seek(offset [, whence]) offset 文件的读/写指针位置 whence 可选,默认0,相对于文件开始的位置. 1, 相对于目前 ...
- Educational Codeforces Round 15 A dp
A. Maximum Increase time limit per test 1 second memory limit per test 256 megabytes input standard ...
- iPhone 6/iPhone 6 Plus硬件性能
iPhone 6/iPhone 6 Plus硬件性能 评分 4 分 正 如之前传闻的,这次同时发布了两款iPhone产品,分别是4.7英寸的iPhone 6和5.5英寸的iPhone 6 Plus.苹 ...
- jq中 offset()方法, scrollTop()方法以及scrollLeft()方法
offset()方法是用来获取元素在当前视窗的相对偏移,其中返回的对象包含两个属性,即top和left,它只对可见元素有效. scrollTop()方法是用来获取元素的滚动条距离顶端的距离. scro ...
- Validform:一行代码搞定整站的表单验证!
表单验证不再发愁,http://validform.rjboy.cn/
- leetcode 131. Palindrome Partitioning----- java
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- 1-1 Windows应用程序的特点
主要内容:介绍Windows应用程序的特点,并附加了消息和事件的一些区别 //以后该分类中字体均采用 隶书 4(14pt) 1. 面向对象 <1>针对Windows应用本身,如记事本界面, ...
- HDU-3853 LOOPS(概率DP求期望)
题目大意:在nxm的方格中,从(1,1)走到(n,m).每次只能在原地不动.向右走一格.向下走一格,概率分别为p1(i,j),p2(i,j),p3(i,j).求行走次数的期望. 题目分析:状态转移方程 ...
- poj1094 拓扑序
题意:现在有多个大写字母(不一定连续),给出字母之间的大小关系,问到第几个关系时就能判断有唯一大小排序或出现矛盾,或是有多个合理排序,若有唯一排序,则输出它. 拓扑序,只不过坑爹的是如果关系处理到一半 ...