Python输入输出(IO)[通俗易懂]

Python输入输出(IO)[通俗易懂]程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的

大家好,又见面了,我是你们的朋友全栈君。

程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(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),会输出:

<__main__.wy2 instance at 0x7f900d0c8050>

 

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上问题

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156039.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java的逻辑运算符_Java语言用条件运算符编程模板

    java的逻辑运算符_Java语言用条件运算符编程模板Java条件运算符条件运算符属于三目运算符,它的语法结构是:布尔表达式?表达式1:表达式2。它的运行原理是这样的,先判断布尔表达式的结果是true还是false,如果是true,则选择表达式1的结果作为整个表达式的结果,反之则选择表达式2的结果作为整个表达式的结果。来看一段代码:publicclassConditionalOperatorTest01{publicstaticvoidm…

    2022年10月2日
    0
  • mysql数据库面试题目及答案_java面试数据库常见问题

    mysql数据库面试题目及答案_java面试数据库常见问题本文的面试题如下:MyisAM和innodb的有关索引的疑问innodb为什么要用自增id作为主键MySql索引是如何实现的说说分库与分表设计(面试过)聚集索引与非聚集索引的区别事务四大特性(ACID)原子性、一致性、隔离性、持久性?事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?MySQL常见的存储引擎InnoDB、MyISAM的区别?【~】数据库三…

    2022年8月27日
    5
  • RSA加密算法详解及例题

    RSA加密算法详解及例题这是我自己在学习RSA加密算法的时候自己整理的笔记,如需转载请注明出处RSA加密算法我这里就不对RSA的发明背景做介绍了,你只要知道RSA加密算法是非常非常重要的加密算法,放在现在的时代亦是如此。RSA加密算法的安全性是基于对极大整数做因数分解的困难。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。例如:(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。(2)甲方获取乙方的公钥,然后用它对信息加密

    2022年6月12日
    66
  • bitnami redmine mysql_Bitnami Redmine相关配置

    bitnami redmine mysql_Bitnami Redmine相关配置下载安装文件bitnami-redmine-3.3.1-0-linux-x64-installer.run官方下载链接:https://bitnami.com/stack/redmine/installer百度网盘链接:http://pan.baidu.com/s/1eRZsfmU密码:iorm一、给文件赋可执行权限。chmod777bitnami-redmine-3.3.1-0-linux…

    2025年6月9日
    0
  • matlab imfill函数「建议收藏」

    matlab imfill函数「建议收藏」Matlab函数imfill简介函数功能:该函数用于填充图像区域和“空洞”。语法格式:BW2=imfill(BW)这种格式将一张二值图像显示在屏幕上,允许用户使用鼠标在图像上点几个点,这几个点围成的区域即要填充的区域。要以这种交互方式操作,BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者

    2022年9月13日
    0
  • wsus补丁服务器搭建_搭建局域网自动更新服务器

    wsus补丁服务器搭建_搭建局域网自动更新服务器1、搭建wsus补丁服务器,在微软官网下载安装包WSUS30-KB972455-x64.exe,地址为:http://www.microsoft.com/en-us/download/details.aspx?id=52162、建议wsus补丁服务器部署在loggetter上,这样省得再买一个winserver2008正版授权,而且就算loggetter故障了,是对整个桌面云…

    2022年10月24日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号