设为首页 收藏本站
查看: 830|回复: 0

[经验分享] 【循序渐进学Python】13.基本的文件I/O

[复制链接]

尚未签到

发表于 2015-4-22 10:00:24 | 显示全部楼层 |阅读模式
  文件I/O是Python中最重要的技术之一,在Python中对文件进行I/O操作是非常简单的。

1. 打开文件
  使用 open 函数来打开文件,语法如下:



open(name[, mode[, buffering]])
  

1.1 文件模式
  open 函数除了必须提供的文件名参数外,其实还有一个 mode 的模式参数,如果没有指定参数值的话,它的默认值是: r。mode参数的可选值如下:



1 'r'                 读模式
2 'w'                 写模式
3 'a'                 追加模式
4 'b'                 二进制模式(可添加到其他模式使用)
5 '+'                 读/写模式(可添加其他模式使用)
  

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参数值,会被写入到文件中(但是调用这个方法之前文本的内容会被覆写掉)。如下:



1 f = open(r'C:\text.txt','w')
2 f.write('hello,')
3 f.write('world')
4 f.close()
  
  写入更多内容
  通过使用 f.writelines 方法,将一个字符串列表(任何序列或可迭代对象)作为参数,即可把这些内容写入到文件(流)中。

  注意:使用 writelines 方法不会增加新行,写入流的方法中也没有对应的 writeline 方法,需要自己增加新行。(不同平台使用不同的换行符,如 Mac 使用 r,Windows 使用 \r\n。可以通过 os.linesep 来获取)。

  
  更新文件内容

  写入了一些文件内容后,这些内容不一定能够理解体现在文件中,因为数据可能被缓存在内存中了,知道关闭时才会被真正写入到文件,如果想要在文件关闭前立即对文件内容进行更新,可以考虑调用文件对象的 flush 方法(该方法不允许其他程序使用该文件的同时访问文件)。

  

2.2 读取文件
  调用 f.read([charCount]) 读取文件内容,根据可选的读取字符数读取文件内容,如果不指定参数则读取还没有被读取过的内容,如下:



1 # -- coding: utf-8 --
2 f = open(r'C:\text.txt','r') # mode = 'r',默认值
3
4 # 读取4个字符
5 print f.read(4) # hell
6 print f.read() # o,world
7 f.close()
  

2.3 关闭文件
  当我们使用完文件对象后应该及时把它关闭掉,以节省系统资源,或者保证文件完整性。这时候我们可以使用 try/finally 语句来完成,通过在 finally 语句中调用 f.close() 方法,确保文件会被关闭:



1 # -- coding: utf-8 --
2 # 打开文件
3 f = open(r'C:\text.txt','w')
4
5 try:
6     # 写入文件
7     f.write('hello,')
8     f.write('world')
9 finally:
10     # 关闭文件
11     f.close()
  
  除了使用 finally 语句来关闭文件,还可以使用 Python 2.5 之后引入的新语法—— with语句 来关闭文件:



1 # -- coding: utf-8 --
2
3 # with 语句体中的代码执行结束后,文件会被自动关闭(即使发生了异常)
4 with open(r'C:\text.txt','w') as f:
5     f.write('hello,')
6     f.write('world')
  
  读取更多内容
  f.read([charCount]) 是逐字节读取的,我们还可以使用更简便的方法: f.readline([charCount]) ,如果不适用任何参数直接读取单独的一行(从当前位置开始,知道一个换行符为止),如果使用一个非负数的整数作为参数,表示可以读取字符的最大值。f.readlines()方法可以读取一个文件中所有的行,并将其作为列表返回。
  

3. 迭代文件内容
  对文件内容进行迭代以及执行一些重复的操作,是最常见的文件操作之一。
  

3.1 按字节处理
  最常见的对文件内容进行迭代的方式是在 while 循环中使用 read 方法:



1 f = open(r'C:\text.txt','r')
2
3 char = f.read(1)
4 while char:
5     print char
6     char = f.read(1)
7 f.close()
  
  当文件达到末尾是,read 方法会返回一个空字符串,则 char 是 false。上面的示例还有可以使用 while true/break 语句实现更简洁的写法:



1 # -- coding: utf-8 --
2 f = open(r'C:\text.txt','r')
3
4 while True:
5     line = f.read(1)
6     if not line:break
7     print line
8 f.close()
  

3.2 按行操作
  按行读取的方式和按字节的方式类似,只需要将 read 方法换成了 readline 方法即可:



1 # -- coding: utf-8 --
2 f = open(r'C:\text.txt','r')
3
4 while True:
5     line = f.readline()
6     if not line:break
7     print line
8 f.close()
  

3.3 一次读取所有内容
  对于一个不是很大的文件,我们可以使用不带参数的 read方法一次性的读取整个文件(当作一个字符串),或者使用 readlines方法把文件读入一个字符串列表中,列表中每个字符串就是一行。下面使用 read 方法读取所有内容:



1 f = open(r'C:\text.txt','r')
2
3 for char in f.read():
4     print char
5 f.close()
  
  使用readlines方法读取所有内容:



1 f = open(r'C:\text.txt','r')
2
3 for line in f.readlines():
4     print line
5 f.close()
  

3.4 按需加载并迭代
  对文件内容进行按需加载,而不是一次性的将其从读到内存的中好处之一就是可以按需加载,节省系统资源,特别是对一些超大的文件来说更是如此。如果对大文件进行迭代操作可以考虑下面的两种方式:
  使用fileinput实现惰性迭代
  需要对一个非常大的文件进行迭代时,使用 readlines 会占用过多的内存,这时候除了可以用 while 循环和 readline 来替代,还可以通过使用 for 循环和 fileinput 模块来实现懒惰迭代——即按需迭代:



1 import fileinput
2
3 for line in fileinput.input(r'C:\text.txt'):
4     print line
  
  使用文件迭代器
  从Python 2.2 开始,文件对象是可迭代的,这表示可以直接在 for 循环对它们进行迭代操作:



1 f = open(r'C:\text.txt')
2 for line in f:
3     print line
4 f.close()
  

参考资料&进一步阅读
  Python Doc —— fileinput
  Python基础教程(第二版)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59512-1-1.html 上篇帖子: 【python爬虫】根据查询词爬取网站返回结果 下篇帖子: 三种常见的聚类算法的python实现 kmeans、Hierarchical clustering、kmedoids
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表