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

[经验分享] python学习笔记之十:文件和素材

[复制链接]

尚未签到

发表于 2015-4-23 08:50:50 | 显示全部楼层 |阅读模式
  这里将介绍函数和对象--文件和流,让你在程序调用期间存储数据,并且可以处理来自其他程序的数据。
  一. 打开文件
  1.1 open函数
  open函数用来打开文件,语法如下:open(name,[.mode[.buffer]])
  它有唯一一个强制参数,就是文件名,然后返回一个文件对象。参数-模式和缓冲都是可选的。
  使用范例:(如果文件不存在,就会报错)



>>> f = open('c:\\text\\test.txt')   #windows下
Traceback (most recent call last):
File "", line 1, in
f = open('c:\text\test.txt')
IOError: [Errno 22] invalid mode ('r') or filename: 'c:\text\test.txt'
  (1)模式
  如果要向文件中写入内容,则必须提供一个模式参数来显式声明。读取文件对象时指定或不指定读模式是一样的效果。
  下面是模式常用值:



值                描述
‘r’              读模式
'w'              写模式
'a'              追加模式
'b'              二进制模式(可添加到其他模式中):改变处理文件的方法,如二进制文件 ‘rb’
'+'              读/写模式(可添加到其他模式中):‘r+’表示读写
  (2)缓冲
  open函数的第三个参数控制着文件的缓冲。
  如果参数是0,I/O就是无缓冲的,所有读写操作都是直接针对硬盘的;
  如果参数是1,I/O就是有缓冲的,用内存代替硬盘,让程序更快,只有使用flush或者close时才会更新硬盘上的数据;
  如果参数大于1,参数的数字代表缓冲区的大小;
  如果参数是-1,代表使用默认的缓冲区大小;
  
  二. 基本文件方法
  2.1 读和写:假设test.txt文本中存了“hello,world!”
  (1)读:f.read(字符个数),可以指定字符个数,不指定时,会读取之前读取过的全部剩余部分;



>>> f = open('D:\\python\\test.txt')
>>> f.read(3)
'hel'
>>> f.read()
'lo,world!'
  注意:在读取文件时,可以省略模式说明,因为‘r’是默认的。
  (2)写:f.write(string),新写入的数据会覆盖掉原有的数据,在关闭文件前,后续的write操作内容会被追加到文件已存在部分的后面;



>>> f = open('D:\\python\\test.txt','r+')
>>> f.write(' bangbangjiang')
>>> f.write('hao')
>>> f.read()
' bangbangjianghao'
>>> f.read()
  
  2.2 管道输出
  在UNIX的shell中,使用管道可以在一个命令后面续写其他的多个命令。
  例如: $ cat somefile.txt | python somesctript.py | sort
  第一个命令是把somefile.txt中的内容写到标准输出;
  第二个命令运行了一个python脚本,脚本内容应该是从标准输入读,把结果写入到标准输出;
  第三个命令是从标准输入读取所有的文本,按字母排序,然后把结果写入标准输出;
  管道符合“|”就是将一个命令的标准输出和下一个命令的标准输入连在一起。
  
  2.3 读写行
  (1) file.readline():读取单独的一行,从当前位置开始直到一个换行符的出现(不同平台上的换行符查看os.linesep);如果含有参数(非负的整数),它表示读取的字符最大值。



>>> f = open('D:\\python\\test.txt')
>>> for i in range(3):
print str(i) + ':' + f.readline()

0:hello,world!
1:welcome to here!
2:there is nothing!
>>> f.close()
  注意:上面的例子可以看出,换行符也会被读出!!读出的句子之间都有一个空行。
  (2) file.readlines():读取一个文件的所有行并将其作为列表返回;



>>> f = open('D:\\python\\test.txt')
>>> f.readlines()
['hello,world!\n', 'welcome to here!\n', 'there is nothing!']
  (3) file.writelines():参数是一个字符串列表,它会把所有的字符串写入文件。注意,程序不会增加新行,需要自己添加。



>>> f = open('D:\\python\\test.txt')
>>> lines = f.readlines()
>>> lines
['I \n', 'am \n', 'a writer!']
>>> f.close()
>>> f = open('D:\\python\\test.txt','w')
>>> lines[1] = 'am not\n'
>>> f.writelines(lines)
>>> f.close()
#文本内容如下:
I
am not
a writer!
  
  2.4 关闭文件
  通常一个文件对象在退出程序后会自动关闭,但是对于写入过的文件总是应该关闭,因为python可能会缓存写入的数据,如果程序因为某些原因崩溃了,那么数据根本不会被写入文件,为了安全起见,要在使用完文件后关闭。
  如果想确保文件被关闭,那么应该使用try/finally语句,并且在finally子句中调用close方法。



f = open('D:\\python\\test.txt','w')
try:
f.write("sss")
finally:
f.close()
  事实上,还有一个语句专门是为这种情况设计的:with



with open('D:\\python\\test.txt','w') as f:
f.write("aaaa")
  文件在语句结束之后会被自动关闭,即便是由于异常引起的结束也是这样。
  
  三. 对文件内容进行迭代
  对文件内容进行迭代以及重复执行一些操作,是最常见的文件操作之一。
  假设do_something.py中有一个函数叫do_something(),运行之:



def do_something(string):
print "hello, " , string
  3.1 按字节处理
  最常见的对文件内容进行迭代的方法是在while循环中使用read方法。



>>> f.open('do_something.py')
>>> while True:
char = f.read(1)
if not char:break
do_something(char)
hello,  def do_something(string):
hello,      print "hello, " , string
hello,  

>>> f.close()
  
  3.2 按行操作
  当处理文件时,经常对文件的行进行迭代。



>>> f.open('do_something.py')
>>> while True:
line = f.readline()
if not line:break
do_something(line)
hello,  def do_something(string):
hello,      print "hello, " , string
hello,  

>>> f.close()
  
  3.3 读取所有内容
  如果文件不大,可以用read()方法一次读取整个文件,但如果文件比较大,使用readlines方法比较好。



>>> f.open('do_something.py')
>>> for char in f.read():
do_something(char)
hello,  def do_something(string):
hello,      print "hello, " , string
hello,  

>>> f.close()
  或者:



>>> f.open('do_something.py')
>>> for line in f.readlines():
do_something(line)
hello,  def do_something(string):
hello,      print "hello, " , string
hello,  

>>> f.close()
  
  3.4 使用fileinput实现懒惰行迭代
  在需要对一个非常大的文件进行行迭代时,readlines所占用的内存会非常多。用for循环可以使用一个名为懒惰行迭代的方法,说它懒惰是因为它只是读取实际需要的文件部分。



>>> import fileinput
>>> for line in fileinput.input('D:\\python\\do_something.py'):
do_something(line)
hello,  def do_something(string):
hello,      print "hello, " , string
hello,  
  
  3.5 文件迭代器
  从2.2版本的python开始,文件对象是可迭代的!这意味着可以直接在for循环中使用它们,从而对它们进行迭代。



f = open('D:\\python\\do_something.py')
>>> for line in f:
do_something(line)

hello,  def do_something(string):
hello,      print "hello, " , string
hello,  
>>> f.close()
  注意:sys.stdin是可迭代的,就是其他的文件对象:



>>> import sys
>>> for line in sys.stdin:
do_something(line)
  

运维网声明 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-59838-1-1.html 上篇帖子: 使用python扩展编写网络发包程序 下篇帖子: Python学习笔记《Python核心编程》第2章 快速入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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