【循序渐进学Python】13.基本的文件I/O
文件I/O是Python中最重要的技术之一,在Python中对文件进行I/O操作是非常简单的。
1. 打开文件
使用 open 函数来打开文件,语法如下:
open(name[, mode[, buffering]])
1.1 文件模式
open 函数除了必须提供的文件名参数外,其实还有一个 mode 的模式参数,如果没有指定参数值的话,它的默认值是: r。mode参数的可选值如下:
'r' 读模式
'w' 写模式
'a' 追加模式
'b' 二进制模式(可添加到其他模式使用)
'+' 读/写模式(可添加其他模式使用)
1.2 缓冲
open 函数的第三个参数( buffering ),表示文件的缓冲,当缓冲区大于0时(等于0时无缓冲,所有的读写操作都直接针对硬盘),Python会将文件内容存放到缓冲区(内存中),从而是程序运行的的更快,这时,只有使用 flush 或者 close 时才会将缓冲区中的数据更新到硬盘中。
2. 文件的读和写
文件流最重要的功能就是读取和写入数据。对应于文件对象来说就是: read 和 write 方法。
三种标准的流:
标准文件对象包括 sys 模块的:stdin,stdout 以及 stderr 都是类文件对象,该对象实现了UNIX标准的I/O机制(Windows 中也能使用)。
2.1 写入文件
每次调用 f.write(string) 时,所提供的string参数值,会被写入到文件中(但是调用这个方法之前文本的内容会被覆写掉)。如下:
f = open(r'C:\text.txt','w')
f.write('hello,')
f.write('world')
f.close()
写入更多内容
通过使用 f.writelines 方法,将一个字符串列表(任何序列或可迭代对象)作为参数,即可把这些内容写入到文件(流)中。
注意:使用
writelines方法不会增加新行,写入流的方法中也没有对应的writeline方法,需要自己增加新行。(不同平台使用不同的换行符,如 Mac 使用r,Windows 使用\r\n。可以通过os.linesep来获取)。
更新文件内容
写入了一些文件内容后,这些内容不一定能够理解体现在文件中,因为数据可能被缓存在内存中了,知道关闭时才会被真正写入到文件,如果想要在文件关闭前立即对文件内容进行更新,可以考虑调用文件对象的
flush方法(该方法不允许其他程序使用该文件的同时访问文件)。
2.2 读取文件
调用 f.read([charCount]) 读取文件内容,根据可选的读取字符数读取文件内容,如果不指定参数则读取还没有被读取过的内容,如下:
# -- coding: utf- --
f = open(r'C:\text.txt','r') # mode = 'r',默认值 # 读取4个字符
print f.read() # hell
print f.read() # o,world
f.close()
2.3 关闭文件
当我们使用完文件对象后应该及时把它关闭掉,以节省系统资源,或者保证文件完整性。这时候我们可以使用 try/finally 语句来完成,通过在 finally 语句中调用 f.close() 方法,确保文件会被关闭:
# -- coding: utf- --
# 打开文件
f = open(r'C:\text.txt','w') try:
# 写入文件
f.write('hello,')
f.write('world')
finally:
# 关闭文件
f.close()
除了使用 finally 语句来关闭文件,还可以使用 Python 2.5 之后引入的新语法—— with语句 来关闭文件:
# -- coding: utf- -- # with 语句体中的代码执行结束后,文件会被自动关闭(即使发生了异常)
with open(r'C:\text.txt','w') as f:
f.write('hello,')
f.write('world')
读取更多内容
f.read([charCount]) 是逐字节读取的,我们还可以使用更简便的方法: f.readline([charCount]) ,如果不适用任何参数直接读取单独的一行(从当前位置开始,知道一个换行符为止),如果使用一个非负数的整数作为参数,表示可以读取字符的最大值。f.readlines()方法可以读取一个文件中所有的行,并将其作为列表返回。
3. 迭代文件内容
对文件内容进行迭代以及执行一些重复的操作,是最常见的文件操作之一。
3.1 按字节处理
最常见的对文件内容进行迭代的方式是在 while 循环中使用 read 方法:
f = open(r'C:\text.txt','r') char = f.read()
while char:
print char
char = f.read()
f.close()
当文件达到末尾是,read 方法会返回一个空字符串,则 char 是 false。上面的示例还有可以使用 while true/break 语句实现更简洁的写法:
# -- coding: utf- --
f = open(r'C:\text.txt','r') while True:
line = f.read()
if not line:break
print line
f.close()
3.2 按行操作
按行读取的方式和按字节的方式类似,只需要将 read 方法换成了 readline 方法即可:
# -- coding: utf- --
f = open(r'C:\text.txt','r') while True:
line = f.readline()
if not line:break
print line
f.close()
3.3 一次读取所有内容
对于一个不是很大的文件,我们可以使用不带参数的 read方法一次性的读取整个文件(当作一个字符串),或者使用 readlines方法把文件读入一个字符串列表中,列表中每个字符串就是一行。下面使用 read 方法读取所有内容:
f = open(r'C:\text.txt','r') for char in f.read():
print char
f.close()
使用readlines方法读取所有内容:
f = open(r'C:\text.txt','r') for line in f.readlines():
print line
f.close()
3.4 按需加载并迭代
对文件内容进行按需加载,而不是一次性的将其从读到内存的中好处之一就是可以按需加载,节省系统资源,特别是对一些超大的文件来说更是如此。如果对大文件进行迭代操作可以考虑下面的两种方式:
使用fileinput实现惰性迭代
需要对一个非常大的文件进行迭代时,使用 readlines 会占用过多的内存,这时候除了可以用 while 循环和 readline 来替代,还可以通过使用 for 循环和 fileinput 模块来实现懒惰迭代——即按需迭代:
import fileinput for line in fileinput.input(r'C:\text.txt'):
print line
使用文件迭代器
从Python 2.2 开始,文件对象是可迭代的,这表示可以直接在 for 循环对它们进行迭代操作:
f = open(r'C:\text.txt')
for line in f:
print line
f.close()
参考资料&进一步阅读
【循序渐进学Python】13.基本的文件I/O的更多相关文章
- 【循序渐进学Python】8.面向对象的核心——类型(下)
1 构造和初始化对象 __init__方法是Python内建众多魔法方法(什么是魔法方法?)中最常见的一个,通过这个方法我们可以定义一个对象的初始操作.当构造函数被调用的时候的任何参数都会传递给__i ...
- 【循序渐进学Python】15.网络编程
Python 内置封装了很多常见的网络协议的库,因此Python成为了一个强大的网络编程工具,这里是对Python的网络方面编程的一个简单描述. 1. 常用的网络设计模块 在标准库中有很多网络设计相关 ...
- 【循序渐进学Python】14.数据库的支持
纯文本只能够实现一些简单有限的功能.如果想要实现自动序列化,也可以使用 shelve 模块和 pickle 模块来实现.但是,如果想要自动的实现数据并发访问,以及更标准,更通用的数据库(databas ...
- 【循序渐进学Python】11.常用标准库
安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...
- 【循序渐进学Python】10.模块和包
1.导入模块 任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索: 在当前所在目录 ...
- 【循序渐进学Python】9.异常处理
1. 抛出异常和自定义异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种 ...
- 【循序渐进学Python】6.Python中的函数
1. 创建函数 一个函数代表一个行为并且返回一个结果(包括None),在Python中使用def关键字来定义一个函数,如下: def hello(name): print 'hello,' + nam ...
- 【循序渐进学Python】1. Python基础知识
1. Python安装和配置 首先需要到Python的官方网站(http://www.python.org/getit/) 下载安装包,现在Python的发行版分为兼容之前Python程序的Pytho ...
- day3学python 字典+列表集合+文件读取
字典+列表集合+文件读取 字典示例 ************************ 各地食品的三级菜单************************* 1.使用字典嵌套字典 2.采用死循环思路 3 ...
随机推荐
- 搭建mongodb集群(副本集+分片)
搭建mongodb集群(副本集+分片) 转载自:http://blog.csdn.net/bluejoe2000/article/details/41323051 完整的搭建mongodb集群(副本集 ...
- 2016年象行中国(上海站)圆满结束,会议PPT分享
2016年象行中国(上海站)已于5-21日圆满结束,所有技术交流的文档和PPT经整理后,现集中存放在云盘中,相关议题如下: DeepGreen-LLVM-Intro.pptx ... 1.1M ...
- Photoshop CS6 for Mac简体中文正式 完美破解版 支持Retina屏
Photoshop CS6 MAC 中文版破解版 支持Retina屏 目前世界上“最好的化妆品”是一款叫做PhotoShop的产品,它可以帮你去除所有你不满意的地方.上周末,这款最好的化妆品推出了第十 ...
- 使用ueditor小结
1. 导入 js: ueditor.config.js ueditor.all.js css/images/plugin: themes lang dialog(可选) third-party(可选) ...
- __getattribute__()、__getattr__()、__setattr__()、__delattr__()
访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...
- Sql Server:不允许 ASSIGNMENT 语句中包含 FOR XML 子句
编写函数的时候遇到“不允许 ASSIGNMENT 语句中包含 FOR XML 子句”错误,开始以为数据库函数里不可以写 FOR XML 子句,仔细看了看总觉得这么写别扭索性改了一种写法就通过了. BE ...
- asp.net中使用ueditor
原文地址:http://blog.uoolo.com/Article/16 还有在MVC中使用ueditor:http://blog.uoolo.com/Article/111 最初百度了一下“编辑器 ...
- Oracle数据库入门——pctfree和pctused详解
一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert ...
- C头文件和源文件的连
(http://blog.163.com/yui_program/blog/static/18415541520115177852896/) 一.源文件如何根据#include来关联头文件 1,系统自 ...
- 支付SDK的安全问题——隐式意图可导致钓鱼攻击
该漏洞涉及到app所使用的intent和intent filter. intent是一个可用于从一个app组件请求动作或处理事件的“消息对象”.Intent负责对应用中一次操作的动作.动作涉及数据. ...