将列表当做堆栈使用
用 append() 方法把一个元素添加到堆栈顶。用不指定索引的 pop() 方法把一个元素从堆栈顶释放出来
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
将列表当做队列使用
用 append() 方法把一个元素添加到队列尾。用不指定索引的 popleft() 方法把一个元素从队列头释放出来
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
Python3 模块
添加模块方法:import xxx # xxx为模块名,即xxx.py的名字
>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
>>>
from ... import语句
Python的from语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
from modname import name1[, name2[, ... nameN]
例如,要导入模块fibo的fib函数,使用如下语句:
>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
这个声明不会把整个fibo模块导入到当前的命名空间中,它只会将fibo里的fib函数引入进来。
from ... import*语句
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
- 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
- __name__ 与 __main__ 底下是双下划线,是“_ _”去掉中间的空格。
Python3 输入和输出
(1)将输出的值转成字符串,可以使用 repr() # 解释器易读的方式 或 str() # 用户易读的方式 函数来实现
>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
注:此方法可加对应的对齐操作,rjust()、ljust() 和 center()、zfill() (数字左边填0),eg: repr(x).rjust(3) # 输出3位的长度,并右对齐
(2)使用 str.format() 函数来格式化输出值,输出的形式将更加多样(形式如C的printf函数)
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam
保留3位小数:
>>> import math
>>> print('The value of PI is approximately {0:.3f}.'.format(math.pi))
The value of PI is approximately 3.142.
在 ':' 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用。
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
... print('{0:10} ==> {1:10d}'.format(name, phone))
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127
可以通过在 table 变量前使用 '**' 来实现相同的功能:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
读和写文件
open() 会返回一个 file 对象,语法格式如下:
open(filename, mode)
- filename:要打开的文件名。
- mode:参数可选, 'r' 文件只读(默认值), 'w' 只写 (如果存在同名文件则将被删除), 和 'a' 用于追加文件内容; 'r+' 同时用于读写
实例:
>>> f = open('/tmp/workfile', 'w')
f.read()
读取文件内容,调用 f.read(size), 将读取一定数目的数据, 然后作为字符串或字节对象返回。
size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
>>> f.read()
'This is the entire file.\n'
>>> f.read()
''
f.readline()
f.readline() 会从文件中读取单独的一行。换行符为 '\n'。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''
f.readlines()
f.readlines() 将返回该文件中包含的所有行。
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
>>> f.readlines()
['This is the first line of the file.\n', 'Second line of the file\n']
另一种方式是迭代一个文件对象然后读取每行:
>>> for line in f:
... print(line, end='')
...
This is the first line of the file.
Second line of the file
这个方法很简单, 但是并没有提供一个很好的控制。 因为两者的处理机制不同, 最好不要混用。
f.write()
f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。如果要写入一些不是字符串的东西, 那么将需要先进行转换:
f.tell()
f.tell() 返回文件对象当前所处的位置, 从文件开头开始的字节数。
f.seek()
改变文件当前的位置, 使用 f.seek(offset, from_what) 函数。
from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
- seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
- seek(x,1) : 表示从当前位置往后移动x个字符
- seek(-x,2):表示从文件的结尾往前移动x个字符
from_what 值为默认为0,即文件开头。
f.close()
在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。
当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常
序号 | 方法及描述 |
---|---|
1 | 关闭文件。关闭后文件不能再进行读写操作。 |
2 | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | 返回文件下一行。 |
6 | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | 读取整行,包括 "\n" 字符。 |
8 | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizeint较大, 因为需要填充缓冲区。 |
9 | 设置文件当前位置 |
10 | 返回文件当前位置。 |
11 | 截取文件,截取的字节通过size指定,默认为当前文件位置。 |
12 | 将字符串写入文件,返回的是写入的字符长度。 |
13 | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
pickle 模块
python的pickle模块实现了基本的数据序列和反序列化。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
基本接口:
pickle.dump(obj, file, [,protocol])
有了 pickle 这个对象, 就能对 file 以读取的形式打开:
x = pickle.load(file)
注解:从 file 中读取一个字符串,并将它重构为原来的python对象。
file: 类文件对象,有read()和readline()接口。
实例1:
#使用pickle模块将数据对象保存到文件
import pickle
data1 = {'a': [1, 2.0, 3, 4+6j],
'b': ('string', u'Unicode string'),
'c': None}
selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)
output = open('data.pkl', 'wb')
# Pickle dictionary using protocol 0.
pickle.dump(data1, output)
# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)
output.close()
实例2:
#使用pickle模块从文件中重构python对象
import pprint, pickle
pkl_file = open('data.pkl', 'rb')
data1 = pickle.load(pkl_file)
pprint.pprint(data1)
data2 = pickle.load(pkl_file)
pprint.pprint(data2)
pkl_file.close()
Python3 OS 文件/目录方法(注:以下多数方法均产生于系统调用)
Python3 OS 文件/目录方法
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
序号 | 方法及描述 |
---|---|
1 | 检验权限模式 |
2 | 改变当前工作目录 |
3 | 设置路径的标记为数字标记。 |
4 | 更改权限 |
5 | 更改文件所有者 |
6 | 改变当前进程的根目录 |
7 | 关闭文件描述符 fd |
8 | os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 | 复制文件描述符 fd |
10 | 将一个文件描述符 fd 复制到另一个 fd2 |
11 | 通过文件描述符改变当前工作目录 |
12 | 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
13 | 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
14 | 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
15 | os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 | 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
17 | 返回文件描述符fd的状态,像stat()。 |
18 | 返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
19 | 强制将文件描述符为fd的文件写入硬盘。 |
20 | 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
21 | 返回当前工作目录 |
22 | 返回一个当前工作目录的Unicode对象 |
23 | 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
24 | 设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 | 修改连接文件权限 |
26 | 更改文件所有者,类似 chown,但是不追踪链接。 |
27 | 创建硬链接,名为参数 dst,指向参数 src |
28 | 返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
29 | 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 | 像stat(),但是没有软链接 |
31 | 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
32 | 以major和minor设备号组成一个原始设备号 |
33 | 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
34 | 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
35 | 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
36 | 创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 | os.mknod(filename[, mode=0600, device]) |
38 | 打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 | 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
40 | 返回相关文件的系统配置信息。 |
41 | 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 | os.popen(command[, mode[, bufsize]]) 从一个 command 打开一个管道 |
43 | 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
44 | 返回软链接所指向的文件 |
45 | 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
46 | 递归删除目录。 |
47 | 重命名文件或目录,从 src 到 dst |
48 | 递归地对目录进行更名,也可以对文件进行更名。 |
49 | 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
50 | 获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
51 | os.stat_float_times([newvalue]) |
52 | 获取指定路径的文件系统统计信息 |
53 | 创建一个软链接 |
54 | 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 | 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
56 | 返回唯一的路径名用于创建临时文件。 |
57 | 返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
58 | 为创建一个临时文件返回一个唯一的路径 |
59 | 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
60 | 删除文件路径 |
61 | 返回指定的path文件的访问和修改的时间。 |
62 | os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
63 | 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
异常处理(try...except...):
先执行try后的语句,如果没有异常,则忽略except后的语句,否则执行直接执行except后的对应错误(有则执行,无则不操作,将异常传递给try语句)操作,再执行try对应的语句
注:
(1)一个except后可以接多个错误操作,一个try后也可添加多个except操作
(2)异常处理可处理发生在try子句中的异常,还能处理子句中调用的函数
>>> while True:
try:
x = int(input("Please enter a number: "))
break
except ValueError:
print("Oops! That was no valid number. Try again ")
except (RuntimeError, TypeError, NameError):
pass
try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。例如:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
定义清理行为
try 语句还有另外一个可选的子句,不管try子句有没有发生异常,finally子句都会执行
>>> try:
raise KeyboardInterrupt
finally:
print('Goodbye, world!')
预定义的清理行为
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上,当执行完毕后,文件会保持打开状态,并没有被关闭
for line in open("myfile.txt"):
print(line, end="")
关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:
with open("myfile.txt") as f:
for line in f:
print(line, end="")
以上这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。