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做完整的复制。

posted on 2018-03-29 21:58  11wayne  阅读(188)  评论(0编辑  收藏  举报

导航