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异步任务队列示例
Apr 01 Python
让python同时兼容python2和python3的8个技巧分享
Jul 11 Python
Python常用随机数与随机字符串方法实例
Apr 09 Python
Python中exit、return、sys.exit()等使用实例和区别
May 28 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
dataframe设置两个条件取值的实例
Apr 12 Python
对Python中plt的画图函数详解
Nov 07 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
Django的性能优化实现解析
Jul 30 Python
python redis连接 有序集合去重的代码
Aug 04 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 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新手上路(十四)
2006/10/09 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
PHP反射机制用法实例
2014/08/28 PHP
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
python修改操作系统时间的方法
2015/05/18 Python
Python中元组,列表,字典的区别
2017/05/21 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Python 从attribute到property详解
2020/03/05 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
美国眼镜网:GlassesUSA
2017/09/07 全球购物
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
学院书画协会部门岗位职责
2013/12/01 职场文书
五一服装活动方案
2014/01/11 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书