Python元组、文件及其他
元组
元组的属性:
- 任意对象的有序集合。 并可以嵌入到任何累呗的对象中。
- 通过偏移存取。
- 属于不可变序列类型。
- 固定长度、异构、任意嵌套。可以包含其他的复合对象(列表、字典和其他元组等)
- 对象引用的数组。 与列表相似,元组最好看作是对象引用的数组。元组存储指向其他对象的存取点(引用)。并且对元组进行索引操作的速度相对较快。
>>> T = tuple('spam') >>> T ('s', 'p', 'a', 'm')
实际应用中的元组
元组支持字符串和列表的一般序列操作
单一对象的元组,在这一单一元素之后,关闭圆括号之前加一个逗号。
在不会引起语法冲突的情况下,Python 允许忽略元组的圆括号。仅当元组作为常量传给函数调用以及当元组在Python2.x的print语句中列出的特殊情况下,圆括号才是必不可少的。
转换、方法以及不可变性
除了常量语法不同以外,元组的操作和字符串以及列表是一致的。值得注意的区别在于“+”、“*”以及分片操作应用于元组时将返回新元组,并且元组不提供字符串、列表和字典中的方法。
例如,如果你想对元组进行排序,通常先得将它转换为列表并使其成为一个可变对象,才能获得使用排序方法调用的权限,或者使用新的sorted内置方法,它接受任何序列对象:
>>> T = ('cc', 'aa', 'dd', 'bb') >>> tmp = list(T) >>> tmp.sort() >>> tmp ['aa', 'bb', 'cc', 'dd'] >>> T = tuple(tmp) >>> T ('aa', 'bb', 'cc', 'dd') >>> T = ('cc', 'aa', 'dd', 'bb') >>> sorted(T) ['aa', 'bb', 'cc', 'dd']
列表解析也可用于元组的转换。
列表解析式名副其实的序列操作——他们总会创建新的列表,但也可以用于遍历包括元组、字符串以及其他类表在内的任何序列对象。我们将会看到,列表解析甚至可以用在某些并非实际储存的序列之上——任何可遍历的对象都可以,包括可自动逐行读取的文件。
尽管元组的方法与列白哦和字符串不同,他们在Python2.6和Python3.0中确实有两个自己的方法——index和count就像对列表一样工作,但是,他们也针对元组对象定义了:
>>> T = (1, 2, 3, 2, 4, 2) >>> T.index(2) 1 >>> T.index(2, 2) 3 >>> T.count(2) 3
同样,注意元组的不可变性只适用于元组本身顶层而并非其内容。例如,元组内部的列表是可以像往常那样修改的。
>>> T = (1, [2, 3], 4) >>> T[1][0] = 'spam' >>> T (1, ['spam', 3], 4)
为什么有了列表还要有元组
最佳答案似乎是元组的不可变性提供了某种完整性。
文件
打开文件
程序调用内置open函数,首先是外部名,接着是处理模式。'r'代表为输入打开文件(默认值),'w'代表为输出生成并打开文件。‘a'代表为在文件为不追加内容儿打开文件。
其他选项:
- 在模式尾部加上b可以进行二进制数据处理
- 加上“+”意味着同时为输入和输出打开文件(也就是说,我们可以对想通文件对象进行读写)
在任何情况下,Python程序中的文本文件都采用字符串的形式。
基础用法的提示:
- 文件迭代器是最好的读取行工具 现在东文本文件读取文字行的最佳方式是笨笨不要读取该文件。
- 内容是字符串,不是对象。
- close 是通常选项
- 文件是缓冲的并且是可查找的 Python文件也是在字节偏移的技术上随机访问的,他们的seek方法允许脚本跳转到制定的位置读取或写入。
实际应用中的文件
注意下面这个例子中,第三个readline调用返回一个空字符串。这是Python文件方法告诉我们已经到达文件底部。(文件的空行是
含有新行符的字符串,而不是空字符串):
>>> myfile = open('myfile.txt', 'w') >>> myfile.write('hello text file\n') 16 >>> myfile.write('goodbye text file\n') 18 >>> myfile.close() >>> myfile = open('myfile.txt') >>> myfile.readline() 'hello text file\n' >>> myfile.readline() 'goodbye text file\n' >>> myfile.readline() ''
Python3.0中的文本和二进制文件
在Python3.0和Python2.x中,文件类型都是由open的第二个参数决定,模式字符串包含一个“b”表示二进制。文本与二进制文件有明显得区别:
- 文本文件吧内容表示为常规的str字符串,自动执行Unicode编码和解码,并且默认执行麽行转换。
- 二进制文件把内容表示为一个特殊的bytes字符串类型,并且允许成俗不修改地访问文件内容。
写入文件时,我们必须使用转换工具把对象转成字符串。注意文件数据在脚本中一定是字符串,而写入方法不会自动第替我们做任何像字符串格式转换的工作。
>>> x, y, z =43, 44, 45 >>> s = 'spam' >>> D = {'a':1, 'b':2} >>> L = [1, 2, 3] >>> >>> F = open('datafile.txt', 'w') >>> F.write(s + '\n') 5 >>> F.write('%s,%s,%s\n' % (x, y, z)) 9 >>> F.write(str(L) +str(D) + '\n') 26 >>> F.close() >>> chars = open('datafile.txt').read() >>> chars "spam\n43,44,45\n[1, 2, 3]{'a': 1, 'b': 2}\n" >>> print(chars) spam 43,44,45 [1, 2, 3]{'a': 1, 'b': 2}
rstrip方法去掉行终止符:
>>> F = open('datafile.txt') >>> line = F.readline() >>> line 'spam\n' >>> line.rstrip() 'spam'
split方法:
>>> line = F.readline() >>> line '43,44,45\n' >>> parts = line.split(',') >>> parts ['43', '44', '45\n']
int方法能够把数字字符串转换为整数对象。注意:我们不一定非要运行rstrip来删除最后部分的“\n",int和一些其他转换方法会忽略数字旁边的空白。
>>> numbers = [int(p) for p in parts] >>> numbers [43, 44, 45]
内置函数eval能够把字符串当做可执行程序代码
>>> line = F.readline() >>> line "[1, 2, 3]${'a': 1, 'b': 2}\n" >>> parts = line.split('$') >>> parts ['[1, 2, 3]', "{'a': 1, 'b': 2}\n"] >>> eval(parts[0]) [1, 2, 3] >>> objects = [eval(p) for p in parts] >>> objects [[1, 2, 3], {'a': 1, 'b': 2}]
用pickle存储Python的原生对象
pickcle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,也不要误饿哦们把字符串转换来转换去。
>>> D = {'a':1, 'b':2} >>> F = open('datafile.pkl', 'wb') >>> import pickle >>> pickle.dump(D, F) >>> F.close() >>> F = open('datafile.pkl', 'rb') >>> E = pickle.load(F) >>> E {'a': 1, 'b': 2}
struct模块:能够把文件中的字符串解读为二进制数据。
>>> F = open('data.bin', 'wb') >>> import struct >>> data = struct.pack('>i4sh', 7, b'spam', 8) >>> data b'\x00\x00\x00\x07spam\x00\x08' >>> F.write(data) 10 >>> F.close() >>> F = open('data.bin', 'rb') >>> data = F.read() >>> data b'\x00\x00\x00\x07spam\x00\x08' >>> values = struct.unpack('>i4sh', data) >>> values (7, b'spam', 8)
seek 函数能够复位你在文件中的当前位置(下次读写将应用在该位置上),flush能够强制性地将缓存输出写入磁盘。
字符串包括str,以及Python3.0中的bytes和Python2.6中的unicode;Python3.0中的bytearray字符串类型是可变的。
结合类似于一个无值得字典的键,frozenset是集合的一个不可变得版本。
引用和拷贝
- 没有限制条件的分片表达式(L[:])能够复制序列。
- 字典copy方法(X.copy())能够复制字。
- 有些内置函数能够生成拷贝(list(L))
- copy标准库模块能够生成完整拷贝
注意:无条件值得分片以及字典copy方法只能做顶层复制。也就是说,不能复制嵌套的数据结构。一个深层嵌套的数据结构的完整的、完全独立的拷贝,要使用标准的copy模块——包括import copy语句,并编辑 x = copy.deepcopy(Y)对任意嵌套对象Y做完整的复制。