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

 from __future__ import print_function   #Python2.7中使用print()函数,Python3.2中这行代码就不需要了
d = {1:'a', 2:'b'}
t = (4, 5, 6)
l = ['love', 'happiness']
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__()函数

 class wy:
def __str__(self):
return "abc" w = wy()
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

按行从文件中读取,有一种简便的方式

 f = open("print.py", "r+")
for line in f: #line的结尾会自动有一个“\n"
print(line, end=" ") #所以end=' ', 默认会又输出换行符

例子,把print.py中的内容读出来,写到一个新文件中,在打印出来。

 f = open("print.py", "r")
f2 = open("wyfile", "w+") #使用w+文件不存在时候才会创建
for line in f:
f2.write(line)
f2.seek(0) #这行语句之前,f2的位置在文末,所以必须调整到文件开头。
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'}
f = open("newfile", "wb+")
pickle.dump(d, f)
del d[2]
pickle.dump(d, f)
f.seek(0)
d2 = pickle.load(f) #这里说明pickle可以区别出一个对象和另一个对象
d3 = pickle.load(f)
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上问题

Python输入输出(IO)的更多相关文章

  1. Python异步IO --- 轻松管理10k+并发连接

    前言   异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...

  2. Python文件IO

    Python文件IO 有如下文本内容,文件路径为D:\temp,文件名称为lyric.txt, line1 Look ! line2 If U had one shot line3 One oppor ...

  3. {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

    python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...

  4. [Python_3] Python 函数 & IO

    0. 说明 Python 函数 & IO 笔记,基于 Python 3.6.2 参考  Python: read(), readline()和readlines()使用方法及性能比较  Pyt ...

  5. Python 输入输出 数据类型 变量

    python输入输出 数据类型 变量 输入输出 print()在Python3中是函数 >>>print('hello world') #print注意print前面不要有任何空格 ...

  6. python异步IO编程(一)

    python异步IO编程(一) 基础概念 协程:python  generator与coroutine 异步IO (async IO):一种由多种语言实现的与语言无关的范例(或模型). asyncio ...

  7. python异步IO编程(二)

    python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...

  8. 简明python教程 --C++程序员的视角(六):输入输出IO

    程序与用户交互 你会从用户那里得到输入,然后打印一些结果.我们可以分别使用raw_input,input和print语句来完成这些功能.raw_input会返回字符串,而input会返回字面值,相当于 ...

  9. python同步IO编程——基本概念和文件的读写

    IO——Input/Output,即输入输出.对于计算机来说,程序运行时候数据是在内存中的,涉及到数据交换的地方,通常是磁盘.网络等.比如通过浏览器访问一个网站,浏览器首先把请求数据发送给网站服务器, ...

随机推荐

  1. POJ 2236 (简单并查集) Wireless Network

    题意: 有n个电脑坏掉了,分别给出他们的坐标 有两种操作,可以O x表示修好第x台电脑,可以 S x y表示x y是否连通 两台电脑的距离不超过d便可连通,两台电脑是连通的可以直接连通也可以间接通过第 ...

  2. 51nod 博弈论水题

    51nod1069 Nim游戏 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误 ...

  3. svn备份脚 本

    一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题.希望对大家有所帮助 ...

  4. hadoop数据容易出现错误的地方

    最近在搞关于数据分析的项目,做了一点总结. 下图是系统的数据流向.容易出现错误的地方.1.数据进入hadoop仓库有四种来源,这四种是最基本的数据,简称ods,original data source ...

  5. [反汇编练习] 160个CrackMe之024

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. RAC 数据库的启动与关闭

    RAC数据库与单实例的差异主要表现在多个实例通过集群件来统一管理共享的资源.因此原有的单实例的管理方式,如数据库.监听器等的关闭启动等可以使用原有的方式进行,也可以通过集群管理工具,命令行来集中管理, ...

  7. 安装Oracle 11g RAC R2 之Linux DNS 配置

    Oracle 11g RAC 集群中引入了SCAN(Single Client Access Name)的概念,也就是指集群的单客户端访问名称.SCAN 这个特性为客户端提供了单一的主机名,用于访问集 ...

  8. 深入理解JavaScript闭包(closure)

    最近在网上查阅了不少javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  9. Linux makefile教程之函数七[转]

    使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做 ...

  10. window 与ubuntu共享文件 hgfs下为空和不用每次挂载hgfs的方法

    解决hgfs为空的方法: sudo apt-get install open-vm-dkms sudo mount -t vmhgfs .host:/ /mnt/hgfs 解决每次都要挂载的方法: 1 ...