forked from xingkeyu/byte_of_python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
14-io.pd
145 lines (97 loc) · 5.66 KB
/
14-io.pd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# 输入 输出
会有这种情况,你的程序必须与用户进行交互。例如,你想获取来自用户的输入,然后打印一些返回的结果。我们可以分别使用`input()`和`print()`函数来实现。
对于输出,我们还可以使用`str`(字符串)类的各种方法。例如,您可以使用`rjust`方法来获取一个指定宽度的字符串。更多细节,见 `help(str)`。
另一个常见的输入/输出类型是处理文件。创建、读和写文件是许多程序至关重要的,我们将在本章探讨这方面。
## 用户输入
将这个程序保存为 `user_input.py`:
~~~python
def reverse(text):
return text[::-1]
def is_palindrome(text):
return text == reverse(text)
something = input('输入文本: ')
if (is_palindrome(something)):
print("是的,这是回文")
else:
print("不,这不是回文")
~~~
输出:
~~~
输入文本: 蜜蜂
不,这不是回文
输入文本: 人上人
是的,这是回文
~~~
它是如何工作的:
我们使用切片特性来颠倒文本。我们已经看到使用`seq[a:b]`代码获取从`a`到`b`[来自序列的切片](#序列)。我们还可以提供一个第三个确定*步长*的参数,切片默认的步长是 `1`,它返回一个连续文本的一部分。给一个负的步长,即 `-1` ,将以反向返回文本。
`input()`函数将一个字符串作为参数,并显示给用户。然后等待用户输入和按回车键。一旦用户输入和按下回车键,`input()`函数将返回用户输入的文本。
我们获取文本并颠倒它。如果原始文本和颠倒的文本是相等的,那么那个文本是一个[回文]([http://en.wiktionary.org/wiki/palindrome)。
家庭作业
: 检查一个文本是否是一个回文应该忽略标点符号、空格和案例。例如,"Rise to vote, sir." 也是一个回文,但我们当前的程序并没有说它是。你能改善上述程序来识别这个回文吗?
*下面的提示(不要读)*
使用一个元组(从这里(http://grammar.ccc.commnet.edu/grammar/marks/marks.htm)你可以找到所有标点符号的一个列表)来保存所有的禁止字符,然后使用会员测试,以确定是否应该删除一个字符,即forbidden = ('!', '?', '.', ...)。
## 文件
为了读写,你可以通过创建一个`file`类的对象,分别使用`read`、`readline`或 `write`方法来,打开和使用文件。能够读取或写入文件取决于文件打开时指定的模式。最后,当你完成对文件的操作时,你要调用`close`方法告诉Python,文件我们使用完了。
例子 (保存为 `using_file.py`):
~~~python
poem = '''\
当工作完成时
编程是有趣的
如果想让你的工作有趣
使用Python!
'''
f = open('poem.txt', 'w') # 为'写w'打开文件
f.write(poem) # 文本写入文件
f.close() # 关闭文件
f = open('poem.txt') # 如果不指定打开模式,默认为'读'
while True:
line = f.readline()
if len(line) == 0: # 0长度表示文件结尾
break
print(line, end='')
f.close() # 关闭文件
~~~
输出:
~~~
$ python3 using_file.py
当工作完成时
编程是有趣的
如果想让你的工作有趣
使用Python!
~~~
它是如何工作的:
首先,通过内置的函数`open`,指定文件名和我们要打开的模式,打开一个文件。模式可以是读模式(`'r'`), 写模式(`'w'`)或追加模式(`'a'`)。我们也可以指定是否以文本格式(`'t'`) 或二进制格式(`'b'`)读,写或追加。实际上有更多可用的模式,`help(open)` 会给你更多的细节。默认情况下,`open()`认为是一个以读方式打开的文本格式的文件。
在我们的例子中,我们首先以写文本格式打开文件,使用文件对象的`write`方法写文件,然后,我们最后 `close`(关闭)文件。
接下来,为再次阅读,我们打开同一个文件。我们不需要指定一个模式,因为 '读文本文件' 是默认的模式。我们使用`readline`方法在一个循环中每次读文件的一行。该方法返回一个完整的行,包括换行符结束时的行。当返回一个*空*字符串时,这意味着我们已经到达文件的末尾,我们'打破'循环。
在默认情况下,`print()`函数在屏幕上自动换行打印文本。我们是通过指定`end=''`禁止产生新行,因为从文件读取的行在结尾已经包含一个换行符。然后,我们最终`close`文件。
现在,检查`poem.txt`的内容,确认程序确实写入和从那个文件读取。
## 拾取
Python提供了一个标准的模块称为`pickle`,使用它你可以在一个文件中存储**任何**的Python对象,然后把它弄回来后,这就是所谓的*持续的*存储对象。
例子 (保存为 `pickling.py`):
~~~python
import pickle
# 我们将要存储对象的文件名
shoplistfile = 'shoplist.data'
# 购物清单
shoplist = ['苹果', '芒果', '胡萝卜']
# 定到文件
f = open(shoplistfile, 'wb')
pickle.dump(shoplist, f) # 把对象倒入一个文件
f.close()
del shoplist # 释放shoplist变量
# 从仓库读回
f = open(shoplistfile, 'rb')
storedlist = pickle.load(f) # 从文件载入对象
print(storedlist)
~~~
输出:
~~~
$ python3 pickling.py
['苹果', '芒果', '胡萝卜']
~~~
它是如何工作的:
要在文件中存储一个对象,我们首先必须以'w'rite写'b'inary 二进制格式的方式`open`打开文件,然后调用`pickle`模块的`dump`函数,这个过程叫*拾取*。
接下来,我们使用`pickle`模块的`load`函数取回对象,这个过程叫做*拆开*。
## 小结
我们已经讨论了各种类型的输入/输出,文件处理和使用pickle模块。
接下来,我们将探讨索异常的概念。