Python3基础之输入和输出实例分析


Posted in Python onAugust 18, 2014

通常来说,一个Python程序可以从键盘读取输入,也可以从文件读取输入;而程序的结果可以输出到屏幕上,也可以保存到文件中便于以后使用。本文就来介绍Python中最基本的I/O函数。

一、控制台I/O

1.读取键盘输入

内置函数input([prompt]),用于从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符):

s = input("Enter your input:")

注:在Python 3.x版本中取消了 raw_input() 函数

2.打印到屏幕

最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式:

print([object, ...][, sep=' '][, end='endline_character_here'][, file=redirect_to_here])

方括号内是可选的,sep表示分割符,end表示结束符,file表示重定向文件。如果要给sep、end、file指定值必须使用关键字参数。

print('hello', 'world', sep='%')  # 输出 hello%world 
print('hello', 'world', end='*')  # 输出 hello world*,并且不换行

二、文件I/O

读写文件之前,先用open()函数打开一个文件,它会返回一个文件对象(file object):

f = open(filename,mode)

如果不指定mode参数,文件将默认以‘r'模式打开。模式中的字符有:

r:只读
w:只写,如果文件已存在则将其覆盖。如果该文件不存在,创建新文件
+:读写(不能单独使用)
a:打开文件用于追加,只写,不存在则创建新文件
b:以二进制模式打开(不能单独使用)

所以可能的模式大概有r、w、r+、w+、rb、wb、rb+、wb+、a、a+、ab、ab+,注意只有w和a可以创建文件。

通常情况下,文件都是以文本模式(text mode)打开的,也就是说,从文件中读写的是以一种特定的编码格式进行编码(默认的是 UTF-8)的字符串。如果文件以二进制模式(binary mode)打开,数据将以字节对象的形式进行读写:

f = open('a.txt','wb+') 
f.write('I like apple!')  # 报错 
f.write(b'I like apple!') # 以bytes对象的形式进行读写

Bytes对象是0到127的不可修改的整数序列,或纯粹的 ASCII 字符,它的用途是存储二进制数据。

可以通过在一个字符串前面加上'b'来创建一个bytes literal;
也可以通过bytes() 函数创建一个 bytes 对象。

注意:如果bytes() 函数的初始化器是一个字符串,那么必须提供一种编码。

b1 = b'This is string' 
b2 = bytes('This is string', 'UTF-8')  # 必须指定编码格式

字符串对象与字节对象是不兼容的,要将 bytes 转变为 str, bytes 对象必须要进行解码,使用decode() 方法:

b = bytes('This is string', 'UTF-8') 
print(b, b.decode(), sep='\n') 
# 输出: 
# b'This is string' 
# This is string

文件对象的方法(假设f是一个文件对象):

f.read(size) :读取size个字节的数据,然后作为字符串或 bytes 对象返回。size是一个可选参数,如果不指定size,则读取文件的所有内容。
f.readline() :读取一行。在字符串末尾会留下换行符 (\n),如果到文件尾,返回空字符串。
f.readlines() :读取所有行,储存在列表中,每个元素是一行,相当于list(f)。
f.write(string) :将 string 写入到文件中,返回写入的字符数。如果以二进制模式写文件,需要将string转换为 bytes 对象。
f.tell() :返回文件对象当前所处的位置,它是从文件开头开始算起的字节数。
f.seek(offset, from_what) :改变文件对象所处的位置。offset是相对参考位置的偏移量,from_what 取值 0(文件头, 默认)、1(当前位置)、2(文件尾)表示参考位置。
f.close() :关闭文件对象。

这些都是很常用的方法,当然文件对象不止这些方法。根据打开的模式不同,open() 返回的文件对象类型也不同:

TextIOWrapper:文本模式,返回TextIOWrapper对象。
BufferedReader:读二进制,即rb,返回BufferedReader对象。
BufferedWriter:写和追加二进制,即wb、ab,返回BufferedWriter对象。
BufferedRandom:读/写模式,即含有+的模式,返回BufferedRandom对象。
可以在这些文件对象上运行 dir() 或 help(),查看它们所有的方法。

补充:

1、在文本模式下,seek()方法只会相对于文件起始位置进行定位。(除了定位文件尾可以用 seek(0, 2)之外)
2、可以循环迭代一个文件对象一行一行读取:

for line in f: 
print(line, end='')

三、格式化输出

一般来说,我们希望更多的控制输出格式,而不是简单的以空格分割。这里有两种方式:

第一种是由你自己控制。使用字符串切片、连接操作以及 string 包含的一些有用的操作。
第二种是使用str.format()方法。
下面给一个示例:

# 第一种方式:自己控制 
for x in range(1, 11): 
  print(str(x).rjust(2), str(x*x).rjust(3), end=' ') 
  print(str(x*x*x).rjust(4)) 
 
# 第二种方式:str.format() 
for x in range(1, 11): 
  print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)) 
 
# 输出都是: 
# 1  1  1 
# 2  4  8 
# 3  9  27 
# 4 16  64 
# 5 25 125 
# 6 36 216 
# 7 49 343 
# 8 64 512 
# 9 81 729 
# 10 100 1000

第一种方式中,字符串对象的 str.rjust() 方法的作用是将字符串靠右,并默认在左边填充空格,类似的方法还有 str.ljust() 和 str.center() 。这些方法并不会写任何东西,它们仅仅返回新的字符串,如果输入很长,它们并不会截断字符串。我们注意到,同样是输出一个平方与立方表,使用str.format()会方便很多。

str.format()的基本用法如下:

>>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) 
We are the knights who say "Ni!"

括号及括号里的字符将会被 format() 中的参数替换.。括号中的数字用于指定传入对象的位置:

>>> print('{0} and {1}'.format('Kobe', 'James')) 
Kobe and James 
>>> print('{1} and {0}'.format('Kobe', 'James')) 
James and Kobe

如果在 format() 中使用了关键字参数,那么它们的值会指向使用该名字的参数:

>>> print('The {thing} is {adj}.'.format(thing='flower', adj='beautiful')) 
The flower is beautiful.

可选项':'和格式标识符可以跟着 field name,这样可以进行更好的格式化:

>>> import math 
>>> print('The value of PI is {0:.3f}.'.format(math.pi)) 
The value of PI is 3.142.

在':'后传入一个整数,可以保证该域至少有这么多的宽度,用于美化表格时很有用:

>>> table = {'Jack':4127, 'Rose':4098, 'Peter':7678} 
>>> for name, phone in table.items(): 
...   print('{0:10} ==> {1:10d}'.format(name, phone)) 
...  
Peter   ==>    7678 
Rose    ==>    4098 
Jack    ==>    4127

我们还可以将参数解包进行格式化输出。例如,将table解包为关键字参数:

table = {'Jack':4127, 'Rose':4098, 'Peter':7678} 
print('Jack is {Jack}, Rose is {Rose}, Peter is {Peter}.'.format(**table)) 
# 输出:Jack is 4127, Rose is 4098, Peter is 7678.

补充:

% 操作符也可以实现字符串格式化。它将左边的参数作为类似 sprintf() 式的格式化字符串,而将右边的代入:

import math 
print('The value of PI is %10.3f.' %math.pi) 
# 输出:The value of PI is   3.142.

因为这种旧式的格式化最终会从Python语言中移除,应该更多的使用 str.format() 。

附:文本模式与二进制模式

1、在Windows系统中,文本模式下,默认是将Windows平台的行末标识符 \r\n 在读时转为 \n ,而在写时将 \n 转为 \r\n 。 这种隐藏的行为对于文本文件是没有问题的,但是对于二进制数据像 JPEG 或 EXE 是会出问题的。在使用这些文件时请小心使用二进制模式。

2、在类Unix/Linux系统中,行末标识符为 \n,即文件以 \n 代表换行。所以Unix/Linux系统中在文本模式和二进制模式下并无区别。

本文所述实例读者可以实际动手操作测试一下,以加深印象,从而进一步牢固掌握Python基础。

Python 相关文章推荐
Python批量提取PDF文件中文本的脚本
Mar 14 Python
PyQt5每天必学之事件与信号
Apr 20 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
python十进制转二进制的详解
Feb 07 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
python制作图形界面的2048游戏, 基于tkinter
Apr 06 Python
python百行代码实现汉服圈图片爬取
Nov 23 Python
一个计算身份证号码校验位的Python小程序
Aug 15 #Python
基于Python的身份证号码自动生成程序
Aug 15 #Python
Python异常处理总结
Aug 15 #Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 #Python
Python3基础之函数用法
Aug 13 #Python
Python3基础之条件与循环控制实例解析
Aug 13 #Python
Python3基础之基本运算符概述
Aug 13 #Python
You might like
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
python操作gmail实例
2015/01/14 Python
python运行其他程序的实现方法
2017/07/14 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
浅谈Python 递归算法指归
2019/08/22 Python
python logging 日志的级别调整方式
2020/02/21 Python
Python短信轰炸的代码
2020/03/25 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
上级检查欢迎词
2014/01/18 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
升职自荐信怎么写
2015/03/05 职场文书
书法社团活动总结
2015/05/07 职场文书
2016国庆促销广告语
2016/01/28 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA
MSSQL基本语法操作
2022/04/11 SQL Server
讲解Python实例练习逆序输出字符串
2022/05/06 Python