2.12. 输入与输出
输入和输出
这将会是解决你的项目与用户交互的办法。例如,你想要从用户处得到输入,然后打印其中的一些结果。我们可以通过分别通过 input()
函数和 print
函数来实现。
对于输出,我们也可以使用 str
类中的方法。例如,你可以使用 rjust
方法得到一个右对齐、有明确宽度的字符串。可以通过 help(str)
来查看更详细的信息。
输入/输出另一个常用的方式就是处理文件。创建、读取、写入文件的能力对于很多程序来说都很重要,我们会在这章探索这个特性。
用户输入
以 io_input.py
保存这个项目:
def reverse(text):
return text[::-1]
def is_palindrome(text):
return text == reverse(text)
something = input("Enter text: ")
if is_palindrome(something):
print("Yes, it is a palindrome")
else:
print("No, it is not a palindrome")
Output:
$ python3 io_input.py
Enter text: sir
No, it is not a palindrome
$ python3 io_input.py
Enter text: madam
Yes, it is a palindrome
$ python3 io_input.py
Enter text: racecar
Yes, it is a palindrome
它是如何工作的
我们使用切片特性来反转文本。我们已经知道了如何通过 seq[a:b]
来得到位置 a
到位置 b
的 序列切片 。我们也可以提供第三个参数来决定切片的 步长 。默认的步长是 1
,因为这样会返回文本连续的部分。给一个负值的步长,即 -1
,会返回文本的反转。
input()
函数将字符串作为参数,并且展示给用户。然后它会等待用户输入并按下返回键。一旦用户输入并按下了返回键, input()
函数会将会返回用户输入的文本。
我们得到文本并反转它。如果原始文本和反转文本相等,那么这个文本就是一个 回文 。
小练习
对英文来说检查一段文字是不是回文,需要忽略标点、空格和大小写。例如:"Rise to vote, sir." 是一句回文,但目前版本的程序还不能认出它。你能够修改程序让它能认出这句回文吗?
如果你需要提示,可以参考这里的想法...1
文件
你可以创建一个 file
类的对象来打开文件以供读写,使用 read
, readline
或 write
中的恰当方法可以读取或写入文件。对文件的读写能力取决于你打开文件时选择的模式。当你处理完文件后,你可以使用 close
方法告诉 Python 你已经使用完文件了。
示例(另存为 io_using_file.py
):
poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''
# 打开文件进行 'w'riting 写操作
f = open('poem.txt', 'w')
# 将文本写入到文件
f.write(poem)
# 关闭文件
f.close()
# 如果没有指定文件打开方式
# 默认使用 'r'ead 读模式
f = open('poem.txt')
while True:
line = f.readline()
# 零行意味着 EOF 文件结尾
if len(line) == 0:
break
# `line` 中已经自带换行了
# 因为它是从文件中读取出来的
print(line, end='')
# 关闭文件
f.close()
输出:
$ python3 io_using_file.py
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
代码是如何工作的?
通过 open
方法我们很容易就能创建新的文件对象。我们指定文件名和打开方式,通过内置的 open
函数打开文件,当文件不存在时则创建文件。文件有很多种打开模式,可以是:读模式('r'
),写模式('w'
)或追加模式('a'
)。我们也可以指定以什么方式进行读、写和追加,是文本模式('t'
)还是二进制模式('b'
)。还有很多打开模式的组合,你可以通过 help(open)
命令来查看详细的说明。默认情况下 open()
认为文件以文本模式打开进行读取操作。
在我们的例子里,第一次我们用 write
方法读取/创建了这个文件,并把字符串变量写入文件里,之后我们用 close
关闭了文件。
接下来我们再次打开同一个文件用于读取。我们不需要指定模式,因为默认的读取文件模式已经足够了。我们在主循环中通过 readline
方法读取文件中的每一行。这个方法每次会返回包括换行符在内的一整行。当读到 空 字符时,就说明已经到了文件的结尾,我们就可以跳出主循环了。
最后,我们用 close
关闭了文件。
从 readline
的输出中我们可以得知:这个程序已经成功地把小诗写入了 poem.txt
文件,并可以从中读取出来,打印到屏幕上。
Pickle
Python 提供了一个标准模块 pickle,你可以使用该模块将任何简单的 Python 对象存储在文件中,然后可再次取回。这个过程也被称为持久化存储对象。
示例 (另存为 io_pickle.py
):
import pickle
# 这里我们将存储对象的文件的名称
shoplistfile = 'shoplist.data'
# 要买的东西的清单
shoplist = ['apple', 'mango', 'carrot']
# 写入文件
f = open(shoplistfile, 'wb')
# 将对象存储到文件
pickle.dump(shoplist, f)
f.close()
# 销毁 shoplist 变量
del shoplist
# 从存储中读回
f = open(shoplistfile, 'rb')
# 从文件加载对象
storedlist = pickle.load(f)
print(storedlist)
输出结果:
$ python io_pickle.py
['apple', 'mango', 'carrot']
怎样运行的
要将对象存储在文件中,必须先以二进制写入模式 open
文件,然后调用 pickle
模块的 dump
函数将对象保存到文件 file
中去,这个过程叫做 pickling。
之后,我们可使用 pickle
模块的 load
函数来检索对象并返回。此过程称为 unpickling 。
Unicode
到目前为止,当我们编写和使用字符串或者读取和写入文件时,我们只使用了简单的英文字符。 英语和非英语字符都可以用 Unicode 码表示(请参阅本节末尾的文章了解更多信息),默认情况下 Python 3 使用 Unicode 存储字符串变量(想想所有我们用单或双或三重引号包裹的文本引号)。
注意:如果你使用的是 Python 2 ,并且我们希望能够读取和编写其他非英语语言,我们需要使用
unicode
类型,所有内容都以字符u
开头,例如:u"hello world"
。
>>> "hello world"
'hello world'
>>> type("hello world")
<class 'str'>
>>> u"hello world"
'hello world'
>>> type(u"hello world")
<class 'str'>
当数据通过网络发送时,我们需要以字节为单位发送数据......这是计算机易于理解的方式。 将 Unicode 码(这是 Python 在存储字符串时使用的)转换为字节的规则称为编码。 一种流行的编码方式是 UTF-8 。 我们可以通过在 open
函数中使用一个简单的关键字参数来读写 UTF-8 。
# encoding=utf-8
import io
f = io.open("abc.txt", "wt", encoding="utf-8")
f.write(u"Imagine non-English language here")
f.close()
text = io.open("abc.txt", encoding="utf-8").read()
print(text)
工作原理
我们使用 io.open
然后在第一个 open 语句中使用 encoding
参数对信息进行编码,然后在解码信息时再在第二个 open 语句中使用该参数。 请注意,我们应该只在文本模式下使用 open 语句时的使用编码。
每当我们编写一个使用Unicode文字的程序(通过在字符串之前放置一个 u
)就像我们上面使用的那样,我们必须确保 Python 本身被告知我们的程序使用UTF-8,我们必须把 # encoding=utf-8
注释在我们程序的顶部。
你应该阅读以下内容,详细了解此主题:
- 「The Absolute Minimum Every Software Deve...
- Python Unicode Howto
- Pragmatic Unicode talk by Nat Batchelder
小结
我们已经讨论了各种类型的输入/输出操作,包括:文件处理、pickle 模块和 Unicode。
接下来我们会探索异常的概念。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。