Google's Python Class(五)——Python 字典和文件
2015-07-21 10:11
891 查看
原文:https://developers.google.com/edu/python/dict-files
在字典中,使用方括号查找或者设置一个值,例如,dict[‘foo’] 查找键为 ‘foo’ 对应的值。字符串、数字和元组可以做键,任何类型都可以当做值。其它类型不一定能正确地用作键(字符串和元组可以正确地用作键是因为它们是不可变的)。查找一个不在字典中的值会报错——使用 “in” 来检查一个键是否在字典中,或者使用 dict.get(key),该方法返回对应的值或者如果键不存在,则返回 None(或者使用 get(key, not-found) 来返回那些键不存在与字典中的值)。
对于字典的 for 循环默认是遍历字典的键。键会按随机的顺序出现。dict.keys() 和 dict.values() 方法显式地返回由键或者值组成的列表。items() 返回一个由 (key, value) 元组组成的列表,这是最高效的检查字典中所有键值数据的方法。所有的这些列表都可以传进 sorted() 函数。
上述这些方法有对应的 “iter” 变体 iterkeys()、itervalues() 和 iteritems(),这些方法避免了构建整个列表的开销——如果数据量很庞大,那么性能会有所提高。无论如何,我通常推荐用合乎实际的名字来使用普通的 keys() 和 values()。在 Python 3000 版本中,没必要使用 iterkeys() 这些变体。
注意:从性能的角度看,字典是一个很好的工具,你应该用尽可能简单的方法来使用它管理数据。例如,你可以需要读取一个每行以一个 ip 地址开头的日志文件,然后将 ip 地址保存到一个字典中用作键,而 ip 地址出现的行作为值。一旦你读取完整个文件,你可以查找任意 ip 地址并且马上查看他所在的行。字典将散乱的数据整理成有条理的东西。
每次读取一行这样做很好,因为这样并不需要一次将所有的文件内容放到内存中——如果你想要查看一个 10GB 文件的每一行,并不需要使用 10GB 的内存。f.readlines() 方法将整个文件读到内存并且返回一个以文件行为内容组成的列表。f.read() 方法读取整个文件并将内容放到一个字符串中,这样便于一次处理全部文本,例如我们后面会讨论到的正则表达式。
对于写操作,f.write(string) 方法是最简单的将数据写到已打开文件的方法。或者你可以对一个已打开的文件使用 “print”,不过这样做在语法上并不友好:”print >> f, string”。在 Python 3000,print 语法被改成普通的函数,并且该函数带有一个可选的参数 file=:”print(string, file=f)”。
对于写操作,请使用 f.write(),因为 print 并没有完美支持 unicode。
哈希表 Dict
Python 中高效的键/值哈希表结构叫做字典(”dict”)。一个字典的内容可以写成一系列包含在大括号 {} 中的键:值对,例如,dict = {key1:value1, key2:value2, … }。“空字典”就是一对空的大括号 {}。在字典中,使用方括号查找或者设置一个值,例如,dict[‘foo’] 查找键为 ‘foo’ 对应的值。字符串、数字和元组可以做键,任何类型都可以当做值。其它类型不一定能正确地用作键(字符串和元组可以正确地用作键是因为它们是不可变的)。查找一个不在字典中的值会报错——使用 “in” 来检查一个键是否在字典中,或者使用 dict.get(key),该方法返回对应的值或者如果键不存在,则返回 None(或者使用 get(key, not-found) 来返回那些键不存在与字典中的值)。
## Can build up a dict by starting with the the empty dict {} ## and storing key/value pairs into the dict like this: ## dict[key] = value-for-that-key dict = {} dict['a'] = 'alpha' dict['g'] = 'gamma' dict['o'] = 'omega' print dict ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'} print dict['a'] ## Simple lookup, returns 'alpha' dict['a'] = 6 ## Put new key/value into dict 'a' in dict ## True ## print dict['z'] ## Throws KeyError if 'z' in dict: print dict['z'] ## Avoid KeyError print dict.get('z') ## None (instead of KeyError)
对于字典的 for 循环默认是遍历字典的键。键会按随机的顺序出现。dict.keys() 和 dict.values() 方法显式地返回由键或者值组成的列表。items() 返回一个由 (key, value) 元组组成的列表,这是最高效的检查字典中所有键值数据的方法。所有的这些列表都可以传进 sorted() 函数。
## By default, iterating over a dict iterates over its keys. ## Note that the keys are in a random order. for key in dict: print key ## prints a g o ## Exactly the same as above for key in dict.keys(): print key ## Get the .keys() list: print dict.keys() ## ['a', 'o', 'g'] ## Likewise, there's a .values() list of values print dict.values() ## ['alpha', 'omega', 'gamma'] ## Common case -- loop over the keys in sorted order, ## accessing each key/value for key in sorted(dict.keys()): print key, dict[key] ## .items() is the dict expressed as (key, value) tuples print dict.items() ## [('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')] ## This loop syntax accesses the whole dict by looping ## over the .items() tuple list, accessing one (key, value) ## pair on each iteration. for k, v in dict.items(): print k, '>', v ## a > alpha o > omega g > gamma
上述这些方法有对应的 “iter” 变体 iterkeys()、itervalues() 和 iteritems(),这些方法避免了构建整个列表的开销——如果数据量很庞大,那么性能会有所提高。无论如何,我通常推荐用合乎实际的名字来使用普通的 keys() 和 values()。在 Python 3000 版本中,没必要使用 iterkeys() 这些变体。
注意:从性能的角度看,字典是一个很好的工具,你应该用尽可能简单的方法来使用它管理数据。例如,你可以需要读取一个每行以一个 ip 地址开头的日志文件,然后将 ip 地址保存到一个字典中用作键,而 ip 地址出现的行作为值。一旦你读取完整个文件,你可以查找任意 ip 地址并且马上查看他所在的行。字典将散乱的数据整理成有条理的东西。
格式化 Dict
% 运算符可以通过名字(键名)将字典中的值替代成字符串。hash = {} hash['word'] = 'garfield' hash['count'] = 42 s = 'I want %(count)d copies of %(word)s' % hash # %d for int, %s for string # 'I want 42 copies of garfield'
Del
“del” 运算符表示删除。对于一些简单的情况,它可以删除一个变量的定义,仿佛该变量没有被定义过一样。Del 可以用于列表元素或者列表的片段来删除列表的一部分,也可以用于删除一个字典中的实体。var = 6 del var # var no more! list = ['a', 'b', 'c', 'd'] del list[0] ## Delete first element del list[-2:] ## Delete last two elements print list ## ['b'] dict = {'a':1, 'b':2, 'c':3} del dict['b'] ## Delete 'b' entry print dict ## {'a':1, 'c':3}
文件
open() 函数打开并且返回一个文件句柄,可以以通常的方式使用该句柄来读写文件。代码 f = open(‘name’, ‘r’) 打开一个文件并赋值给变量 f,准备好读取操作,完成的时候使用 f.close()。除了使用 ‘r’,也可以使用 ‘w’ 来写,’a’ 来追加。特殊模式 ‘rU’ 对于文本文件是“通用的”选项(”通用换行模式”),该模式可以把所有的换行符(’\r’ ‘\n’ ‘\r\n’)智能地转换为 ‘\n’(Windows 的换行是 ‘\r\n’,Unix 的是 ‘\n’,Mac 的是 ‘\r’)。标准的 for 循环适用于文本文件,遍历文件的行(这仅适用于文本文件,不适用于二进制文件)。for 循环是简单又高效的查看文本文件中所有行的方法:# Echo the contents of a file f = open('foo.txt', 'rU') for line in f: ## iterates over the lines of the file print line, ## trailing , so print does not add an end-of-line char ## since 'line' already includes the end-of line. f.close()
每次读取一行这样做很好,因为这样并不需要一次将所有的文件内容放到内存中——如果你想要查看一个 10GB 文件的每一行,并不需要使用 10GB 的内存。f.readlines() 方法将整个文件读到内存并且返回一个以文件行为内容组成的列表。f.read() 方法读取整个文件并将内容放到一个字符串中,这样便于一次处理全部文本,例如我们后面会讨论到的正则表达式。
对于写操作,f.write(string) 方法是最简单的将数据写到已打开文件的方法。或者你可以对一个已打开的文件使用 “print”,不过这样做在语法上并不友好:”print >> f, string”。在 Python 3000,print 语法被改成普通的函数,并且该函数带有一个可选的参数 file=:”print(string, file=f)”。
Unicode 文件
“codecs” 模块提供读取 unicode 文件的支持。import codecs f = codecs.open('foo.txt', 'rU', 'utf-8') for line in f: # here line is a *unicode* string
对于写操作,请使用 f.write(),因为 print 并没有完美支持 unicode。
练习:wordcount.py
结合所有的 Python 基础知识(字符串、列表、字典、元组、文件),尝试完成 google-python-exercises 中 wordcount.py 的问题(位于 basic/ 目录下)。相关文章推荐
- Python 中"元类"
- Python中修饰器
- Python中的设计模式
- Python高级特性之:List Comprehensions、Generator、Dictionary and set comprehensions
- Python 符号计算的瑞士军刀——SymPy
- 详解Python的Django框架中inclusion_tag的使用
- Python:列表生成式
- python 列表生成式
- Python多线程学习
- 如何像Python高手(Pythonista)一样编程
- python反转字符串(简单方法)及简单的文件操作示例
- python Tips系列:判断list是否为空
- PYTHON单元测试
- Python_12-线程编程
- 【python learing】玩玩pythonanywhere
- Python文件操作
- Python的高级特性7:闭包和装饰器
- 详解Python的Django框架中inclusion_tag的使用
- 详解Python的Django框架中Manager方法的使用
- 在Python的Django框架中使用通用视图的方法