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 类的对象来打开文件以供读写,使用 readreadline 或 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 注释在我们程序的顶部。

你应该阅读以下内容,详细了解此主题:

小结

我们已经讨论了各种类型的输入/输出操作,包括:文件处理、pickle 模块和 Unicode。

接下来我们会探索异常的概念。


  1. 你可以使用元组来储存所有的非法字符,然后使用成员测试来判断字符是否应该被移除,例如:forbidden = (!?., ...)。你可以 在这里 找到所有的标点符号。 ↩

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
讨论数量: 1
发起讨论 只看当前版本


php110
open 方式
0 个点赞 | 1 个回复 | 问答 | 课程版本 2018