输入和输出
这将会是解决你的项目与用户交互的办法。例如,你想要从用户处得到输入,然后打印其中的一些结果。我们可以通过分别通过input()函数和print函数来实现。
对于输出,我们也可以使用str类中的方法。例如,你可以使用rjust方法得到一个右对齐、有明确宽度的字符串。可以通过help(str)来查看更详细的信息。
输入/输出另一个常用的方式就是处理文件。创建、读取、写入文件的能力对于很多程序来说都很重要,我们会在这章探索这个特性。
用户输入
以io_input.py保存这个项目:
输出:
它是如何工作的
我们使用切片特性来反转文本。我们已经知道了如何通过seq[a:b]来得到位置a到位置b序列切片。我们也可以提供第三个参数来决定切片的步长。默认的步长是1,因为这样会返回文本连续的部分。给一个负值的步长,即-1,会返回文本的反转。
我们得到文本并反转它。如果原始文本和反转文本相等,那么这个文本就是一个回文。
小练习
对英文来说检查一段文字是不是回文,需要忽略标点、空格和大小写。例如:"Risetovote,sir."是一句回文,但目前版本的程序还不能认出它。你能够修改程序让它能认出这句回文吗?
如果你需要提示,可以参考这里的想法...
文件
你可以创建一个file类的对象来打开文件以供读写,使用read,readline或write中的恰当方法可以读取或写入文件。对文件的读写能力取决于你打开文件时选择的模式。当你处理完文件后,你可以使用close方法告诉Python你已经使用完文件了。
示例(另存为io_using_file.py):
输出:
代码是如何工作的?
通过open方法我们很容易就能创建新的文件对象。我们指定文件名和打开方式,通过内置的open函数打开文件,当文件不存在时则创建文件。文件有很多种打开模式,可以是:读模式('r'),写模式('w')或追加模式('a')。我们也可以指定以什么方式进行读、写和追加,是文本模式('t')还是二进制模式('b')。还有很多打开模式的组合,你可以通过help(open)命令来查看详细的说明。默认情况下open()认为文件以文本模式打开进行读取操作。
在我们的例子里,第一次我们用write方法读取/创建了这个文件,并把字符串变量写入文件里,之后我们用close关闭了文件。
接下来我们再次打开同一个文件用于读取。我们不需要指定模式,因为默认的读取文件模式已经足够了。我们在主循环中通过readline方法读取文件中的每一行。这个方法每次会返回包括换行符在内的一整行。当读到空字符时,就说明已经到了文件的结尾,我们就可以跳出主循环了。
最后,我们用close关闭了文件。
从readline的输出中我们可以得知:这个程序已经成功地把小诗写入了poem.txt文件,并可以从中读取出来,打印到屏幕上。
Pickle
Python提供了一个标准模块pickle,你可以使用该模块将任何简单的Python对象存储在文件中,然后可再次取回。这个过程也被称为持久化存储对象。
示例(另存为io_pickle.py):
输出结果:
怎样运行的
要将对象存储在文件中,必须先以二进制写入模式open文件,然后调用pickle模块的dump函数将对象保存到文件file中去,这个过程叫做pickling。
之后,我们可使用pickle模块的load函数来检索对象并返回。此过程称为unpickling。
Unicode
到目前为止,当我们编写和使用字符串或者读取和写入文件时,我们只使用了简单的英文字符。英语和非英语字符都可以用Unicode码表示(请参阅本节末尾的文章了解更多信息),默认情况下Python3使用Unicode存储字符串变量(想想所有我们用单或双或三重引号包裹的文本引号)。
注意:如果你使用的是Python2,并且我们希望能够读取和编写其他非英语语言,我们需要使用unicode类型,所有内容都以字符u开头,例如:u"helloworld"。
当数据通过网络发送时,我们需要以字节为单位发送数据......这是计算机易于理解的方式。将Unicode码(这是Python在存储字符串时使用的)转换为字节的规则称为编码。一种流行的编码方式是UTF-8。我们可以通过在open函数中使用一个简单的关键字参数来读写UTF-8。
工作原理
我们使用io.open然后在第一个open语句中使用encoding参数对信息进行编码,然后在解码信息时再在第二个open语句中使用该参数。请注意,我们应该只在文本模式下使用open语句时的使用编码。
每当我们编写一个使用Unicode文字的程序(通过在字符串之前放置一个u)就像我们上面使用的那样,我们必须确保Python本身被告知我们的程序使用UTF-8,我们必须把#encoding=utf-8注释在我们程序的顶部。
小结
我们已经讨论了各种类型的输入/输出操作,包括:文件处理、pickle模块和Unicode。