python123第七章_Python入门第7/10页

Python入门第7/10页

更新时间:2007年02月08日 00:00:00   作者:

第七章 输入输出

有几种办法可以从程序输出;数据可以用可读的形式显示,或保存到文件中以备日后使用。本章讨论一些输入输出的办法。

7.1 输出格式控制

到现在为止我们已经看到了两种输出值的方法:表达式语句和print语句。(第三种方法是使用文件对象的write()方法,标准输出文件可以用sys.stdout引用。参见库参考手册)。

我们常常需要控制输出格式,而不仅仅是显示空格分开的值。有两种办法控制输出格式:一种办法是自己进行字符串处理,用字符串的片断和合并操作可以产生任何可以想象的格式。标准模块string包含了诸如把字符串填充到指定的列宽这样的有用操作,后面会有提及。

另一种办法是使用%运算符,此运算符以一个字符串为左运算元,它按C的sprintf()函数格式把右运算元转换为字符串,返回转换结果。

问题是:如何把值转换为字符串?

幸运的是,Python有一种办法可以把任何值转换为字符串:使用repr()函数,或把值写在两个反向引号(``)之间。例如:

>>> x = 10 * 3.14

>>> y = 200*200

>>> s = 'The value of x is ' + `x` + ', and y is ' + `y` + '...'

>>> print s

The value of x is 31.4, and y is 40000...

>>> # 反向引号也适用于非数值型

... p = [x, y]

>>> ps = repr(p)

>>> ps

'[31.4, 40000]'

>>> # 转换字符串对字符串加字符串引号和反斜杠

... hello = 'hello, world\n'

>>> hellos = `hello`

>>> print hellos

'hello, world\012'

>>> # 反向引号内可以是一个序表

... `x, y, ('spam', 'eggs')`

"(31.4, 40000, ('spam', 'eggs'))"

下面是两种写出平方、立方表的方法:

>>> import string

>>> for x in range(1, 11):

...     print string.rjust(`x`, 2), string.rjust(`x*x`, 3),

...     # 前一行的结尾逗号表示不换行

...     print string.rjust(`x*x*x`, 4)

...

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

>>> for x in range(1,11):

...     print'%2d %3d %4d' % (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

注意print输出的各项之间额外加了一个空格,这是print的规定。

此例显示了函数string.rjust()的用法,此函数可以把一个字符串放进指定宽度右对齐,左边用空格填充。类似函数还有string.ljust()和string.center()。这些函数不向外输出,只是返回转换后的字符串。如果输入字符串太长也不会被截断而是被原样返回。这样的处理可能会使你的列对齐失效,但这可能比截断要好一些,截断的结果是我们看到一个错误的值。(如果你确实需要截断的话总可以再加一层片断,如string.ljust(x,n)[0:n])。

还有一个函数string.zfill(),可以在数值左边填零。此函数可以处理带有加减号的情况:

>>> string.zfill('12', 5)

'00012'

>>> string.zfill('-3.14', 7)

'-003.14'

>>> string.zfill('3.14159265359', 5)

'3.14159265359'

%操作符的用法如下例:

>>> import math

>>> print 'The value of PI is approximately %5.3f.' % math.pi

The value of PI is approximately 3.142.

如果有多个值可以用一个序表给出,这时格式字符串中要有多个格式,如:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}

>>> for name, phone in table.items():

...     print'%-10s ==> %10d' % (name, phone)

...

Jack       ==>       4098

Dcab       ==>    8637678

Sjoerd     ==>       4127

大多数格式与C用法相同,要求要输出的值的类型符合格式的需要。但是,如果你没有引发例外错误的话也不会产生内核堆列。Python的%s格式要宽得多:如果相应的输出项不是字符串对象,就先用str()内置函数把它变成字符串。在格式指定中宽度指定为*号表示后面的输出项中多出一个指定宽度的整数。C格式%n和%p未被支持。

如果你有一个长格式串不想把它分开,可以在指定格式的地方指定名字,这样就不需要按次序去把格式和名字对应起来,这种格式为“%(变量名)格式”,例如:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}

>>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table

Jack: 4098; Sjoerd: 4127; Dcab: 8637678

这里输出项总是一个字典,字典的各项值是要输出的值,字典的键值是各值的名字。这种输出格式经常与内置函数var()配合使用,var()返回包含所有局部变量的字典。

7.2 读写文件

open()打开一个文件对象,经常使用两个参数:“open(文件名,模式)”。例如:

>>> f=open('/tmp/workfile', 'w')

>>> print f

第一自变量是一个包含了文件名的字符串,第二自变量是文件打开方式的字符串。模式‘r '表示读取,‘w'表示只写(已有的同名文件被清除),‘a'表示打开文件在尾部添加, ‘r+'表示打开文件既可以读也可以写。打开方式参数可选,缺省为‘r'模式。

在Windows和Macintosh中在模式中加入‘b'表示以二进制格式打开文件,如‘rb'、‘wb '、‘r+b'。Windows对文本文件和二进制文件有不同的处理,文本文件中的换行字符在读写时有变化。这种对文件数据的幕后的修改不影响ASCII文本文件,但是会破坏二进制数据如JPEG 或“.EXE”文件的数据。读写这样的文件一定要使用二进制格式。(Macintosh中文本模式的精确描述依赖于使用的C库)。

7.2.1 文件对象的方法

本节后面的例子假设已经建立了一个名为f的文件对象。

为了读取文件内容,调用f.read(size),可以读入一定字节数的数据返回为一个字符串。size 是一个可选数值参数,省略size或size取负值时读入整个文件并返回为一个字符串;如果文件比你的机器内存大一倍,那是你的问题。指定了正的size的时候之多读入并返回size字节。如果读到了文件尾,f.read()返回一个空串("")。如:

>>> f.read()

'This is the entire file.\012'

>>> f.read()

''

f.readline()从文件中读入一行,返回的字符串中将包括结尾的一个换行符(\n),如果文件的最后一行没有换行符则由该行读入的字符串也没有结尾的换行符。这样,由readline() 返回的结果不会有歧义,读入结果为空串时一定是到了文件尾,读入一个'\n'时为空行。

>>> f.readline()

'This is the first line of the file.\012'

>>> f.readline()

'Second line of the file\012'

>>> f.readline()

''

f.readlines()反复调用f.readline(),返回一个包含文件所有行的列表。

>>> f.readlines()

['This is the first line of the file.\012', 'Second line of the file\012']

f.write(string)把string的内容写入到文件中,返回None。

>>> f.write('This is a test\n')

f.tell()返回文件对象的当前读写为止,按从文件开始的字节数算。为了改变读写位置,使用“f.seek(位移,从哪里)”。读写位置按一个参考点加上位移来计算,参考点用“从那里”参数指定,取0时从文件头开始算,取1时按当前位置算,取2时从文件尾算。缺省值是0 ,从文件开始算。

>>> f=open('/tmp/workfile', 'r+')

>>> f.write('0123456789abcdef')

>>> f.seek(5)     # 从文件头前进5个字节,到达第6个字符

>>> f.read(1)

'5'

>>> f.seek(-3, 2) # 转到结尾前3个字符

>>> f.read(1)

'd'

用外一个文件后调用f.close()关闭文件,释放打开文件所占用的系统资源。文件关闭后再使用此文件对象就无效了。

>>> f.close()

>>> f.read()

Traceback (innermost last):

File "", line 1, in ?

ValueError: I/O operation on closed file

文件对象还有其它一些不太常用的方法,例如isatty()和truncate(),参见库参考手册。

7.2.2 pickle模块

字符串可以很容易地从文件读入或向文件写出。读入数值要麻烦一些,因为read()方法总是返回字符串,要把读入的字符串传给象string.atoi()这样的函数,把象‘123'这样的字符串转换为对应的整数值123。但是,当你想保存更复杂的数据类型如列表、字典或类实例时,读写就要复杂得多。

Python的设计使程序员可以不必反复编写调试保存复杂数据类型的代码,它提供了一个叫做pickle的标准模块。这个令人惊异的模块可以把几乎任何Python对象转换为字符串表示,这个过程叫做腌制,从对象的字符串表示恢复对象叫做恢复。在腌制和反腌制之间,对象的字符串表示可以保存在文件或数据中,甚至于通过网络连接传送到远程计算机上。

如果你有一个对象x,有一个可写的文件对象f,最简单的腌制对象的办法是下面一行代码:

pickle.dump(x, f)

为了恢复对象,如果刚才的文件已打开用于读取,文件对象名仍为f,则:

x = pickle.load(f)

(腌制和恢复还有其它用法,可以腌制多个对象,可以不把数据写入文件,详见库参考手册)。

pickle是保存Python对象并被其它程序或同一程序以后再运行时调用的标准办法,这种做法的专用术语叫做“持久对象”。因为pickle使用广泛,许多Python扩展模块的作者都留意使新增加的数据类型如矩阵可以正确地腌制和恢复。

相关文章

今天小编就为大家分享一篇在IPython中执行Python程序文件的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-11-11

这篇文章主要介绍了python格式化字符串的方法,实例展示了常见的几类Python针对字符串的格式方法,非常实用,需要的朋友可以参考下2014-09-09

这篇文章主要介绍了使用pygame实现垃圾分类小游戏功能(已获校级二等奖),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07

今天小编就为大家分享一篇TensorFlow内存管理bfc算法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-02-02

这篇文章主要介绍了Python heapq使用详解及实例代码的相关资料,需要的朋友可以参考下2017-01-01

今天小编就为大家分享一篇python实现对列表中的元素进行倒序打印,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2019-11-11

这篇文章主要介绍了Django admin管理工具TabularInline类用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-05-05

今天小编就为大家分享一篇python画柱状图--不同颜色并显示数值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-12-12

这篇文章主要介绍了django 快速启动数据库客户端程序的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-08-08

这篇文章主要介绍了python动态性强类型用法,对比C#实例分析了python动态性强类型的使用方法,需要的朋友可以参考下2015-05-05

最新评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理

运行时区域1.程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里(概念模型,各种虚拟机可能会通过一些更高效的方式实现&#…

php baocuo error,PHP编译报错configure: error: Cannot find libmysqlclient under /usr.

今天编译PHP的时候遇到了几个错误,记录一下第一次编译的时候报错如下:configure: error: mcrypt.h not found. Please reinstall libmcrypt.报这个错是因为没有安装libmcrypt这个包,下载地址如下:wget ftp://mcrypt.hellug.gr/pub…

dart和python哪个好_RedMonk 2020 年 Q1 编程语言排行:Python 冲进前二,Dart 值得关注...

知名软件行业分析公司 RedMonk 发布了 2020 年第一季度编程语言排行榜。RedMonk 编程语言排行榜通过追踪编程语言在 GitHub 和 Stack Overflow 上的代码使用情况与讨论数量,统计分析后进行排序,其旨在深入了解潜在的语言采用趋势。该榜单一年发布两次&am…

jclouds_使用jclouds在S3上分段上传

jclouds1.目标 在上一篇文章中 ,我们研究了如何使用jclouds中的通用Blob API将内容上传到S3。 在本文中,我们将使用jclouds的S3特定的异步API上传内容并利用S3提供的分段上传功能。 2.准备 2.1。 设置自定义API 上传过程的第一部分是创建jclouds API-这…

mysql+表中公共信息,計算mysql中兩個表之間的公共行數

so heres my question...這是我的問題…Hi have two tables in mysql, called go_H and go_J, both looking like this:在mysql中有兩個表,叫做go_H和go_J,它們都是這樣的:go_Hgo_H---------------------------| gene | GoCode |-----------------------…

极域课堂管理系统软件如何取消控制_微缔电子组装业MES系统软件六大功能组成...

电子组装业MES系统软件六大功能组成MES系统软件是制造执行系统的英文简称,MES系统软件在整个企业信息集成系统中承上启下,是生产活动与管理活动信息沟通的桥梁,MES系统软件在产品从工单下发到生产成成品的整个过程中,扮演着促进生…

使用虚拟时间测试基于时间的反应堆堆芯流

Reactor Core实现了Reactive Streams规范,并处理了(可能无限的)数据流。 如果您感兴趣,请查看它提供的出色文档 。 在这里,我假设对Reactor Core库的Flux和Mono类型有一些基本的了解,并且将介绍Reactor Cor…

matlab二维数组排序函数,Matlab 用sort函数排序 二维数组

在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可, 如果排序后还需要保留原来的索引可以用返回值,即[B,ind]sort(A),计算后&am…

多个cuda 被单进程沾满_报名 | 提高GPU利用率,听英伟达专家分享这个CUDA工具

随着 NVIDIA GPU 计算性能的不断提升,如何提升 GPU 利用率是开发者普遍关心的问题之一。从 Kepler 架构开始,NVIDIA GPU 支持多个 CUDA kernels 函数的并发执行,称为 Hyper-Q 技术。Hyper-Q 技术支持多个 CUDA streams、多个 CPU threads 或者…

usb转ttl模块与matlab,USB接口转TTL小板的自检测试

现在电脑基本上都不会配置DB9串行数据端口了,这给一些喜欢折腾刷机和单片机加载程序的朋友带来了诸多的不便。还好,随着技术的发展,USB接口转TTL的产品越来越成熟,而这种产品主要以采用PL-2303HX芯片作为主控器的居多,…

程序员python工作_程序员如何在工作中进步

工作,对于大部分人都是不可避免的一件事,有的人是为了生存,有的人是为了自我价值的实现,也有人是为了将来不工作而现在努力工作,出发点可能各种各样,但是工作总是大部分人不可避免的一部分。程序员&#xf…

matlab 误差椭圆,求3倍标准差误差椭圆分析的程序

根据《白话空间统计之九:方向分布(标准差椭圆)修正版》(有些地方没有理解清楚),写了下面的程序。但是好像结果不对Zmvnrnd([0.5 1.5], [0.025 0.03 ; 0.03 0.16], 50);XZ(:,1); YZ(:,2);mean_Xnanmean(X); mean_Ynanmean(Y); %椭圆圆心%确定长短半轴…

java ee cdi_Java EE CDI处理程序方法示例

java ee cdi这是CDI Disposer方法的教程。 在CDI中,由于Producer方法生成的对象随后可以注入到应用程序中,因此使用Disposer方法,以便在其工作完成时将其删除。 Disposer方法始终与Producer方法匹配。 Disposer方法使用的一个示例是当应用程…

python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程。类似这样:每个方程有两个变量,x和y,形式为:axbycd由于这次有了两个方程,我们提取参数的代码就适合提炼为一…

快速提示:使用Chrome开发工具调试GWT应用程序

调试是软件开发的重要方面。 拥有正确的工具可以节省大量时间和头痛。 在GWT Super Dev模式之前,经典的Dev模式允许使用JVM调试。 开发人员可以在其IDE中设置断点,并使用调试模式来跟踪错误和错误。 现在,在超级开发模式下,情况有…

用matlab做纹理合成,关于图像纹理合成的Matlab例程

纹理是普遍存在的视觉现象,其可以描述地形、植物、矿石、纤维和皮肤等等物体的表面特征。纹理结构在图像中反映其图像像素取值的空间变化情况,这种变化具有某中统计规律,在纹理区域内的各部分具有大致相同的结构。纹理合成是利用计算机产生纹…

python 服务端与c++客户端通讯_[原创]python socket 服务端 与 c++客户端通讯,发包内容加密,支持大文件,并发...

代码经过网络搜索,综合算是原创吧.py脚本为服务端项目文件在https://github.com/jinjie412/service_client_socketimport socketserverimport jsonimport base64import osfrom te import OPMysql,Caltimeimport time#数据库操作opm OPMysql()#加密发包内容def crypt(source,ke…

matlab评估边缘检测性能,【模糊推理】模糊逻辑图像边缘检测,原理+matlab代码~...

这篇博客是接着上一篇来哒,https://blog.csdn.net/luolan9611/article/details/94285158本篇博客及上篇博客搜集的资料、实验代码、实验报告、PPT均已上传至百度网盘:链接:https://pan.baidu.com/s/1AmT4TtBAxj1FKf4KUFcsBw 提取码&#x…

qt中实现左右分割线_Qt项目中,实现屏幕截图并生成gif的详细示例(值得细读)...

总第50篇平时我们在工作和学习的过程中,有时需要将桌面的某些动作截图生成gif动图,以更生动地呈现出来。目前有很多这样的软件,并且方便易使用,比如我经常使用的GifCam,软件小巧,生成的图片文件也比较小&am…

构建Spring Boot RESTful服务+ Spring Boot执行器

总览 什么是REST? REST(代表状态转移)是Web构建的体系结构样式,已成为用于Web应用程序的标准软件设计模式 。 代表性国家转移一词最早由REST的发起人,HTTP规范的主要作者之一Roy Fielding在其博士论文中使用 。 REST上…