Python 基础教程(第二版)(第十~十一章)
第十章
- 包(package):当模块存储在文件中时(扩展名 .py),包就是模块所在的目录,但必须包含一个名为 _init_.py 的文件。
- 探究模块:
- dir : 要查看模块所包含的内容,dir函数会将对象多有特性列出。
- _all_:包含一个列表,定义了模块的共有接口(public interface)。在模块中设置__all__,使用其他模块导入该模块的时候(from * 这种形式导入),只能导入 __all__中设定的变量、函数和类。
- help():查看函数或模块用途的详细说明。
- _file_属性:可以查看模块的绝对路径。
- 标准库:
- sys module
- sys.argv:包括传递到Python解释器的参数,包括脚本名称。
- sys.exit(int):大多数使用默认值0用来标识程序成功运行,也可以提供字符串信息用作错误信息。
- sys.modules:映射模块名到载入模块的字典。
- sys.path:字符串列表,是模块所在目录的目录名列表。
- sys.platform:字符串,是解释器正在其上运行的“平台”名称。如操作系统(win32)或如Java虚拟机的其他种类平台。
- sys.stdin, sys.stdout, sys.stderr:是类文件流对象,他们表示UNIX概念中的标准输入、标准输出和标准错误。
- os module:
- os.environ:对环境变量进行映射
>>>os.environ['PYTHONPATH']
- os.system(command):在子shell中执行操作系统命令,用来运行外部程序。
- os.sep:用于路径中的分隔符。UNIX中的标准分隔符是“/”,Windows中的是“\”。
- os.pathsep:pathsep用于分割路径名。UNIX使用“:”,Windows 使用“;”。
- os.linesep:用于文本文件的字符串分隔符。UNIX中为一个换行符 (\n), Mac OS 中为单个回车符 (\r), Windows 中则是两者的组合 (\r\n)。
- os.urandom(n):使用一个依赖于系统的“真”随机数源,如果平台不支持,就会得到 NotImplementError。
- os.environ:对环境变量进行映射
- fileinput module:
- fileinput.(input([files[, inplace[, backup]]])) :用于遍历多个输入流的行。参数(inplace=True)进行原地处理。在原地处理时backup参数将文件名扩展备份到原始文件创建的备份文件中。
- fileinput.filename():返回当前正在处理的文件名。
- fileinput.lineno():返回当前累计的行数。所以在完成一个文件处理并开始处理下一个文件时,行数不会重置而是将上一个文件的最后行数加一作为计数的开始。
- filename.filelineno():返回当前处理的文件的当前行数。每次在完成一个文件处理并开始处理下一个文件时,行数都会重置为1。
- filename.isfirstline():在当前行数当前文件的第一行时返回真值,反之,返回假值。
- filename.isstdin():在当前文件为sys.stdin时返回真值,否则返回假值。
- filename.nextfile():关闭当前文件,跳到下一个文件,跳过的行不计。
- filename.close():关闭当前文件链,结束迭代。
- Set 集合:主要用于检查成员资格,因此副本是被忽略的。
- & | ^:可对两个集合进行按位与、按位或和按位异或计算,分别得到两个集合的交集、并集和对称差集。
- union(set):求两集合的并集。
a.union(b)
- issubset(set):判断是不是一个集合的子集。
a.issubset(b)
- isuperset(set):判断是不是一个集合的父序列。
a.issuperset(b)
- intersection(set):求两集合的交集。
a.intersection(b)
- difference(b):求集合a对集合b的差集。与直接进行减运算效果相同
a.difference(b)
a-b - symmetric_difference(set):求两集合的对称差集。
- copy():复制一集合。
- heap 堆
- heappush(heap, x):将x入堆
- heappop(heap):将堆中最小的元素弹出
- heaify(heap):将heap属性强制应用到任意一个列表。使用任意列表作为参数,并且通过尽可能少的移位操作,将其转换成合法的堆。
- heapreplace(heap, x):将堆中最小的元素弹出,同时将x入堆
- nlargest(n, iter):返回iter中第n大的元素
- nsmallest(n, iter):返回iter中第n小的元素
- deque 双端队列
- 支持append, appendleft, pop, popleft, rotate, extend, extendleft等操作。
- time module
- 日期元组:Python 日期元组的字段含义0-8分别对应年、月、日、时、分、秒、周、儒历日和夏令时。
- time.asctime([tuple]):将当前时间转化为字符串。
- time.localtime([secs]):将实数(从新纪元开始的秒数)转化为本地时间的元组。如果想要获得全球统一时间可以使用gmtime。
- time.mktime(tuple):将日期元祖转换成从新纪元开始计算的秒数。
- time.sleep(secs):休眠secs秒
- time.strptime(string[, format]):将字符串转换为日期元祖。
- time.time():使用自新纪元开始计算的秒数返回当前时间。
- random module
- random.random():返回 0<=n<1 的实数。
- random.getrandbits(n):以长整型返回n个随机位(二进制数)
- random.uniform(a, b):返回 a<=n
- sys module
第十一章
打开文件:open(name[, mode[, buffering]])。open 函数使用一个文件名作为唯一的强制参数,然后返回一个对象文件。模式(mode)和缓冲(buffering)参数都是可选的。
- r:读模式
- w:写模式
- a:追加模式
- b:二进制模式(可添加到其他模式中使用)
- +:读/写模式(可添加到其他模式中使用)
在模式参数中使用U参数能够再打开文件时使用通用的换行符支持模式,在这种模式下,所有的换行符/字符串都被替换为\n,而不用考虑也运行的平台。
缓冲(buffering):
- 0(或者 False):I/O(输入/输出)就是无缓冲的,所有读写都是直接针对硬盘。
- 1(或者 True):I/O 就是有缓冲的,使用内存来代替硬盘。
- 大于1的数字:表示缓冲区的大小(字节)
- -1(或者任何负数):表示默认的缓冲区大小
基本文件方法–读和写。首先解释一个术语:类文件——类文件对象是支持一些文件的方法和对象。如果有一个名为f的类文件对象,就可以使用f.write()和f.read(string)写入和读取对象。
>>>f.open('somefile.txt', 'w') #默认为 r 模式
>>>f.write('Hello, ')
>>>f.write('World!')
>>>f.close()
>>>f.open('somefile.txt', 'r')
>>>f.read(4)
'Hell'
>>>f.read() #通过不提供要读取字符数的方式会读取剩下所有的文件。
o, World!
管式输出:在UNIX的shell中,使用管道(pipeline)可以在一个命令后面学些其他的多个命令,如
$ cat somefile.txt | python somescript.py | sort
- cat somefile.txt:只是把somefile.txt的内容写到标准输出(sys.stdout)
- python somescript.py:这个命令运行了Python脚本somescript。结果应该是从标准输入读,把结果写到标准输出。
- sort:这条命令从标准输入(sys.stdin)读取所有文本,按字母顺序,然后把结果写到标准输入。
管道符号(|)将一个命令的标准输入和下一个标准输入连在一起。这样somescript.py会从sys.stdin中读取数据(cat somefile.txt写入的),并把结果写入它的sys.stdout(sort在此读入数据)。
随机访问:可以使用seek和tell来直接访问感兴趣的部分。
- seek(offset[, whence]):把当前位置(进行读和写的位置)移动到由offset定义的位置。whence.offset是一个字节(字符)数,默认为0,即偏移量(非负)是从文件头开始计算的。
>>>f.open(r'c:\text\somefile.txt', 'w')
>>>f.write('0123456789')
>>>f.seek(5)
>>>f.write('Hello, World!')
>>>f.close(r'c:\text\somefile.txt')
>>>f.rean()
01234Hello, World!56789
- tell():返回当前文件的位置
>>>f = open(r'c:\text\somefile.txt')
>>>f.read(3)
012
f.read(2)
34
f.tell()
5 #在这种情况下返回的是一个长整数,但不是所有情况都是这样的
- seek(offset[, whence]):把当前位置(进行读和写的位置)移动到由offset定义的位置。whence.offset是一个字节(字符)数,默认为0,即偏移量(非负)是从文件头开始计算的。
- 读写行
- file.readline():读取单独的一行(从当前位置开始知道一个换行符的出现,也读取这个换行符),不适用任何参数(这样读取并返回一行)或使用一个非负整数作为readline可以读取字符的最大值。
- file.readlines():读取一个文件中的所有行并将其作为列表返回。
- writelines:传给它一个字符串列表(任何序列或者可迭代对象),它会把所有字符串写入文件(或流)。不会增加新行,需要自己添加。
- 关闭文件:通常来说,一个文件对象在退出程序后(也可能在退出前)自动关闭。with语句可以打开文件并将其赋值到变量上。文件再语句结束后会自动关闭,即便是由于异常引起的。
with open('somefile.txt') as somefile
do_something(somefile)
在写入了一些文件内容之后,通常是希望这些改变立刻体现在文件证,这样其他读取了这个文件的程序也能知道改变。如果数据被缓存了(在内存中临时地存储),知道关闭文件才会被写入到文件。如果需要继续使用文件(不关闭文件),又想将磁盘上的文件进行更新,就要调用问价对象的flush方法。不管在什么时候,能关闭文件的时候最好关闭文件。 - 上下文管理器(context manager):支持上下文管理协议的对象,这种对象实现了enter()和exit()方法。
- enter():不带任何参数,它在进入with语句块的时候,被调用,返回绑定值到as关键后的变量上。返回文件对象本身。
- exit():带有三个参数:异常类型、异常对象和异常回溯。在离开方法时这个函数被调用。如果返回False,那么所有异常都不会被处理。会关闭文件。
- 对文件内容进行迭代:
- 按字节处理:
f = open(filename)
char = f.read(1)
while char:
process(char)
char = f.read(1) #当到达文件末尾时,read()返回一个空的字符串
f.close()
- 按行操作:
f = open(filename)
while True:
line = f.readline()
if not line: break
process(line)
f.close()
- 读取所有内容:可以使用不带参数的read()一次读取整个文件,也可以使用readlines()把文件读入一个字符串列表,这样列表中每个字符串就是一行。
- 使用fileinput实现懒惰行迭代:当文件非常大时,使用readlines会占用太多内存。可以使用for可以使用一个名为懒惰行迭代的方法,因为他只是读取实际需要的部分。
import fileinput
for line in fileinput(filename):
process(line)
- 文件迭代器:从 Python 2.2开始,文件对象就是可迭代的,即可在for循环中使用它们。
f = open(filename)
for line in f:
process(line)
f.close()
对文件进行迭代而不使用变量存储文件对象,不需要显式地关闭文件
for line in open(filename):
process(line)
标准输入是可迭代的for line in sys.stdin
- 按字节处理: