Python基础-输入输出(IO)

程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的角度也是文件,所以程序的输入输出就是文件读写。

1,内置函数print()

Python2.7中是有print语句和内置print函数的,而在Python3.3中,已经没有print语句了,只有print函数,而其实以前的print语句的功能就是print函数默认形式的功能,所以我们在这里就只看看Python3.3中的内置函数print()。

函数原型

  1. print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

flush=False是Python3.3加上去的参数。

objects中每一个对象都会被转化为string的形式,然后写到file指定的文件中,默认是标准输出(sys.stdout),每一个对象之间用sep分隔,默认是空格;所有对象都写到文件后,会写入end,默认是换行。

一个例子,我们对sep和end作了修改

  1. 1 from __future__ import print_function Python2.7中使用print()函数,Python3.2中这行代码就不需要了
  2. 2 d = {1:'a', 2:'b'}
  3. 3 t = (4, 5, 6)
  4. 4 l = ['love', 'happiness']
  5. 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. 1 class wy:
  2. 2 def __str__(self):
  3. 3 return "abc"
  4. 4
  5. 5 w = wy()
  6. 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. 1 f = open("print.py", "r+")
  2. 2 for line in f: line的结尾会自动有一个“\n"
  3. 3 print(line, end=" ") #所以end=' ', 默认会又输出换行符

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

  1. 1 f = open("print.py", "r")
  2. 2 f2 = open("wyfile", "w+") #使用w+文件不存在时候才会创建
  3. 3 for line in f:
  4. 4 f2.write(line)
  5. 5 f2.seek(0) #这行语句之前,f2的位置在文末,所以必须调整到文件开头。
  6. 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模块。

  1. 1 d = {1:'a', 2:'b', 3:'c'}
  2. 2 f = open("newfile", "wb+")
  3. 3 pickle.dump(d, f)
  4. 4 del d[2]
  5. 5 pickle.dump(d, f)
  6. 6 f.seek(0)
  7. 7 d2 = pickle.load(f) #这里说明pickle可以区别出一个对象和另一个对象
  8. 8 d3 = pickle.load(f)
  9. 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上问题

 
 
分类: Python

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

  1. [Python基础]006.IO操作

    IO操作 输入输出 print raw_input input 文件 打开文件 关闭文件 读文件 写文件 文件指针 实例 输入输出 输入输出方法都是Python的内建函数,并且不需要导入任何的包就可以 ...

  2. python基础之IO编程

    读文件 with open('/path/to/file', 'r') as f: print(f.read()) 调用read()会一次性读取文件的全部内容,read()函数里面可以传入每次最多读取 ...

  3. python基础(17)-IO模型&selector模块

    先说一下IO发生时涉及的对象和步骤.对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(k ...

  4. python基础之IO模型

    IO模型分类 五种IO Model blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO多路复用 signal driven IO 信号驱动 ...

  5. python基础---输入输出

    1.输入字符串. name=input()   or name=input('please input a string') 这样可以接收一个字符串,包括空格,都可以输入.只有回车不接受,作为结束符, ...

  6. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  7. Python基础笔记系列十一:标准输入输出、文件读写和指针等操作

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 标准输入输出一.输入 在sublime中这个时候需要安装SublimeRE ...

  8. Python基础之:Python中的IO

    目录 简介 linux输入输出 格式化输出 f格式化 format格式化 repr和str %格式化方法 读写文件 文件对象的方法 使用json 简介 IO就是输入和输出,任何一个程序如果和外部希望有 ...

  9. python基础 — 致初学者的天梯

    Python简介 Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新 功能的添加,越来越多被用于独立的.大型项目 ...

随机推荐

  1. jQuery版推箱子游戏详解和源码

    前言 偶然间看到很多用js写游戏的感觉很炫酷的样子,所以就想试试,就看了一些资料和某前端站点的视屏.于是乎就自己动手实践了一下,上推箱子截图 感觉很丑陋,但是功能是实现了.再说貌似大多都是这样的吧,这 ...

  2. 杭电dp题集,附链接还有解题报告!!!!!

    Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f ...

  3. Socket 学习(三).3 TCP UDP 图解

    TCP 照我的理解就是 发送 和接收 不能用 同一个端口. 下面是 UDP的: 我的理解是 tcp 是 连接模式,udp 是断开模式.这里有2条连接线,就是跟 上面 Socket 的最大区别,udpC ...

  4. BS导出csv文件的通用方法(.net)

    最近把以前项目里用的导出文件的功能提取成了dll,通过读取Attribute来得到要导出的表头(没有支持多语言),使用时只要组织好要导出的数据,调用方法就好了,希望对大家有用. 使用时只需引用下载包里 ...

  5. 项目管理实践 -- 健身小管家(Fitness housekeeper)的管理(4)

    提前几天把检查更新的功能完成了.

  6. svg的自述

    svg可缩放矢量图形(Scalable Vector Graphics). SVG 使用 XML 格式定义图像. SVG 是使用 XML 来描述二维图形和绘图程序的语言. 什么是SVG? SVG 指可 ...

  7. 安卓CTS官方文档之兼容性测试套件简介

    官方英文文档原文:https://source.android.com/compatibility/cts-intro.html Compatibility Test Suite 兼容性测试套件 Ho ...

  8. c#兼容 PHP中的md5

    原文:c#兼容 PHP中的md5 由于工作需要,需要使用C#去对一个php程序做二次开发.在登录验证的时候,发现一个小问题. 就是用C#写的md5算法得出的结果和php的md5()得出的结果有时候会不 ...

  9. OpenStreetMap架构

    OpenStreetMap框架简介 1.OSM平台开发 OpenStreetMap(缩写OSM)地图是一个合作项目,我们的目标是创建一个免费的内容,让所有的人都可以编辑的世界地图. OSM在地图上由一 ...

  10. SQL Server 2012的附件失败,与硬链接的问题

    1.我在系统上做了硬链接,也就是把C盘的某个目录,映射为D盘. 2.把数据库文件mdf和ldf放入D盘.结果,SQL Server的企业管理器,无法从D盘里加载mdf或ldf文件,并且在目录下无法显示 ...