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

[经验分享] Python输入输出(IO)

[复制链接]

尚未签到

发表于 2015-4-21 11:44:32 | 显示全部楼层 |阅读模式
  程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的角度也是文件,所以程序的输入输出就是文件读写。
  
  1,内置函数print()
  Python2.7中是有print语句和内置print函数的,而在Python3.3中,已经没有print语句了,只有print函数,而其实以前的print语句的功能就是print函数默认形式的功能,所以我们在这里就只看看Python3.3中的内置函数print()。
  函数原型



print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
  flush=False是Python3.3加上去的参数。
  objects中每一个对象都会被转化为string的形式,然后写到file指定的文件中,默认是标准输出(sys.stdout),每一个对象之间用sep分隔,默认是空格;所有对象都写到文件后,会写入end,默认是换行。
  一个例子,我们对sep和end作了修改



1 from __future__ import print_function   #Python2.7中使用print()函数,Python3.2中这行代码就不需要了
2 d = {1:'a', 2:'b'}
3 t = (4, 5, 6)
4 l = ['love', 'happiness']
5 print(d, t, l, sep='~', end='^_^\n')
  我们已经知道d,t,l会被打包成一个tuple,赋给objects。如果对于print函数定义以及调用方式不熟悉,参见另一片博文[Python基础-函数]
  程序输出
  {1: 'a', 2: 'b'}~(4, 5, 6)~['love', 'happiness']^_^
  
  [注意] 以上代码用的Python2.7去解释运行,在Python2.7中,默认print会应用到print语句,如果想禁用print语句而使用print()内置函数,这必须从__future__中引入print_function,即第一行语句。
  
  2,把object转化为str的形式,str()和repr()
  在Python中,字符串(strings)是由内置类str代表的,这是一个类。同时Python还有内置函数str()。
  输入输出都是以字符串的形式,print()就是把非str的object转化为其str的形式输出。那么Python怎么把一个object转化为str的形式呢,Python会把这个object传给内置str()函数。
  str()回去寻找这个对象的__str__()属性,如果这个对象没有__str__()属性,str()会调用repr()来得到结果。
  
  一个例子,自定义的类,定义了__str__()函数



1 class wy:
2     def __str__(self):
3         return "abc"
4
5 w = wy()
6 print(w)
  输出:abc
  如果没有定义__str__(),则会调用repr(wy),会输出:
  
  
  3,文件输入输出
  使用内置函数open()得到一个文件对象(file object)。
  open(filename, mode='r')  
  mode可以有如下形式:'r'-读;'w'-写;'a'-从文件末尾追加(appending);'r+' -读写;'w+'-读写(文件不存在时会创建);读写二进制(binary mode)文件时,加上'b'

  文件对象的方法属性:
  f.read(size)        返回最多size个字节的str,当size缺省或为负值时,整个文件内容都被作为一个str读出来,若到文末,返回空串' '
  f.readline()        返回文件中一行的str,末尾加上换行符'\n'
  f.write(string)    将string写入file,返回成功写入的字符个数。
  f.close()             文件对象使用完一定要close()掉。
  f.seek(offset, from_what)      改变文件对象的位置(position),offset为偏移量,from_what为参考位置,为0时从文件开头, 为1时使用当前的文件位置,为2是使用文件末尾位置。from_what默认为0
  按行从文件中读取,有一种简便的方式



1 f = open("print.py", "r+")
2 for line in f:             #line的结尾会自动有一个“\n"
3     print(line, end=" ")   #所以end=' ', 默认会又输出换行符
  
  例子,把print.py中的内容读出来,写到一个新文件中,在打印出来。



1 f = open("print.py", "r")
2 f2 = open("wyfile", "w+") #使用w+文件不存在时候才会创建
3 for line in f:
4     f2.write(line)
5 f2.seek(0)       #这行语句之前,f2的位置在文末,所以必须调整到文件开头。
6 print(f2.read(), end=' ')
7 f.close()       #记住要释放
8 f2.colse()
  
  
  4,标准库pickle模块
  我们已经知道输入输出都是字符串,要把一个对象存进文件,要将其转化为字符串;从文件中读出来的也是字符串,如果我们再要构建对象,则从读出来的字符串去做。
  那如果我们并不在乎文件存储对象的形式,只想得到一个字符串去代表对象,用于存储,或用于网络传递,有没有更好的方法呢?
  有的,这就是Python标准库的pickle模块。pickle模块提供了一套算法,用于对一个Python对象进行serializing(序列化为字符串)和de-serializing(从字符串构建对象),这个过程叫做pickle和unpickle。
  pickle模块两个最常用的方法
  pickle.dump(object, file)      将object序列化进file
  pickle.load(file)                   从file中解出当前位置的下一个对象
  一个例子,简单的试验和测试了一下pickle模块。



0 import pickle
1 d = {1:'a', 2:'b', 3:'c'}
2 f = open("newfile", "wb+")
3 pickle.dump(d, f)
4 del d[2]
5 pickle.dump(d, f)
6 f.seek(0)
7 d2 = pickle.load(f)   #这里说明pickle可以区别出一个对象和另一个对象
8 d3 = pickle.load(f)
9 print(d2, d3)
  close(f)
  使用Python2.7运行,输出结果:
  ({1: 'a', 2: 'b', 3: 'c'}, {1: 'a', 3: 'c'})
  那么文件"newfile"中是些什么内容呢,cat newfile得到如下东西
  (dp0
I1
S'a'
p1
sI2
S'b'
p2
sI3
S'c'
p3
s.(dp0
I1
S'a'
p1
sI3
S'c'
p2
  不太看得明白这是两个dict对象吧,可以看出,pickle确实使用了一些算法。
  
  [题外]在写上面这个测试例子的时候,我开始运行的时候,始终报错,说pickle模块没有dump这个方法,后来google了一下,在stackoverflow上找到了答案,是我把文件名取为了pickle.py,所以根本没有import进标准的pickle模块,改了就好了,见参考3
  
  
  参考:
  1,http://docs.python.org/3.3/tutorial/inputoutput.html  Python文档
  2,http://docs.python.org/3.2/library/pickle.html
  3,http://stackoverflow.com/questions/3558718/how-do-i-pickle-an-object     Stackoverflow上问题
  
  

运维网声明 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-59209-1-1.html 上篇帖子: Python中递归的最大次数 下篇帖子: [zt]Python的函数参数传递:传值?引用?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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