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中requests模块的使用方法
Apr 08 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Python Web程序部署到Ubuntu服务器上的方法
Feb 22 Python
python占位符输入方式实例
May 27 Python
python禁用键鼠与提权代码实例
Aug 16 Python
python opencv实现证件照换底功能
Aug 19 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
python实现简单银行管理系统
Oct 25 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
如何在Python 游戏中模拟引力
Mar 27 Python
python GUI模拟实现计算器
Jun 22 Python
详解python模块pychartdir安装及导入问题
Oct 22 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中的CMS的涵义
2007/03/11 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
jQuery的强大选择器小结
2009/12/27 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
JS实现六位字符密码输入器功能
2016/08/19 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python实现一次创建多级目录的方法
2015/05/15 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
2017/12/09 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
高三学习决心书
2014/03/11 职场文书
学校端午节活动总结
2015/02/11 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
公司董事任命书
2015/09/21 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android