您的位置:首页 > 编程语言 > Python开发

深入Python3 (Dive Into Python3)笔记3--解析

2010-11-23 21:19 281 查看


一切内容都是摘抄,主要是便于回忆和鼓励自己不要间断,更详细内容请见原帖地址:


《深入 python3
》中文版


http://woodpecker.org.cn/diveintopython3/index.html


3.1深入

3.2. 处理文件和目录

Python 3 带有一个模块叫做 os,代表 “操作系统(operating system)。” os 模块 包含非常多的函数用于获取(和修改)本地目录、文件进程、环境变量等的信息。

3.2.1. 当前工作目录

使用os.getcwd() 函数获得当前工作目录。使用os.getcwd() 函数获得当前工作目录。

运行os.chdir()函数时,即使在Windows上,我也总是使用Linux风格的路径(正斜杠,没有盘符)。这就是Python 尝试隐藏操作系统差异的一个地方。

3.2.2. 处理文件名和目录名

os.path.join() 函数从一个或多个路径片段中构造一个路径名。 在这个例子中, 它仅仅是简单的拼接字符串.

print(os.path.join('/Users/pilgrim/diveintopython3/examples', 'humansize.py'))

这个例子稍微复杂一点, 在和文件名拼接前,join函数给路径名添加一个额外的斜杠。由于我在Windows 上写这个例子, 这个斜杠是一个反斜杠而不是正斜杠。如果你在Linux 或者Mac OS X上重现这个例子, 你将会看见正斜杠. 无论你使用哪种形式的斜杠,Python 都可以访问到文件。

os.path.expanduser() 用来将包含~符号(表示当前用户Home目录)的路径扩展为完整的路径。在任何有Home 目录概念的操作系统上(包括Linux,Mac OS X 和Windows),这个函数都能工作。返回的路径不以斜杠结尾,但是os.path.join()并不介意这一点。

结合这些技术,你可以很方便的构造出用户Home 目录下的文件和目录的路径。 os.path.join()可以接受任何数量的参数。当我发现这一点时我大喜过望, 因为在一门新的语言中构造我的工具箱时,addSlashIfNecessary()总是我不得不写的愚蠢的小函数之一。不要 在Python 中写这个愚蠢的小函数,聪明的人们已经帮你考虑过这个问题了。

os.path 也包含用于分割完整路径名,目录名和文件名的函数

split 函数分割一个完整路径并返回目录和文件名。

os.path 也包含os.path.splitext() 函数,它分割一个文件名并返回短文件名和扩展名。可以使用同样的技术将它们的值赋值给不同的变量。

3.2.3. 罗列目录内容

glob 模块是Python标准库中的另一个工具,它可以通过编程的方法获得一个目录的内容,并且它使用熟悉的命令行下的通配符。

glob 模块接受一个通配符并返回所有匹配的文件和目录的路径。在这个例子中,通配符是一个目录名加上 “*.xml”, 它匹配examples子目录下的所有.xml 文件。

在glob模式中你可以使用多个通配符。这个例子在当前工作目录中找出所有扩展名为.py并且在文件名中包含单词test 的文件。

3.2.4. 获取文件元信息

调用os.stat() 函数返回一个包含多种文件元信息的对象。

st_mtime 是最后修改时间,它的格式不是很有用。(技术上讲,它是从纪元,也就是1970年1月1号的第一秒钟,到现在的秒数)

time 模块是Python标准库的一部分。 它包含用于在不同时间格式中转换,将时间格式化成字符串以及处理时区的函数。

time.localtime() 函数将从纪元到现在的秒数这个格式表示的时间(os.stat()函数返回值的st_mtime 属性)转换成更有用的包含年、月、日、小时、分钟、秒的结构体。这个文件的最后修改时间是2009年7月13日下午5:25。

os.stat() 函数也通过st_size 属性返回文件大小。文件feed.xml 的大小是 3070 字节。

3.2.5. 构造绝对路径

但是当你希望构造一个从根目录开始或者是包含盘符的绝对路径时,你就需要用到os.path.realpath()函数了。

3.3. 列表解析

列表解析提供了一种紧凑的方式,实现了通过对列表中每一个元素应用一个函数的方法来将一个列表映射到另一个列表.

[elem * 2 for elem in a_list]

为了理解这一点,请从右向左看。 a_list是你要映射的列表。Python解释器逐个访问a_list的元素,并临时将元素赋值给变量elem。 然后Python 对元素应用函数elem * 2并且将结果添加到返回列表中。

你可以在列表解析的最后加入if子句来过滤列表。对于列表中每一个元素if 关键字后面的表达式都会被计算。如果表达式的计算结果为True,那么这个元素将会被包含在输出中。

3.4. 字典解析

这是一个字典解析。 除了两点以外,它的语法同列表解析很类似。首先,它被花括号而不是方括号包围; 第二,对于每一个元素它包含由冒号分隔的两个表达式,而不是列表解析的一个。冒号前的表达式(在这个例子中是f)是字典的键;冒号后面的表达式(在这个例子中是os.stat(f))是值。

3.4.1. 其他同字典解析有关的小技巧

这里是一个可能有用的通过字典解析实现的小技巧: 交换字典的键和值。

{value:key for key, value in a_dict.items()}

3.5. 集合解析

同样,集合也有自己的集合解析的语法。它和字典解析的非常相似,唯一的不同是集合只有值而没有键:值对。

集合解析的输入并不一定要是集合; 可以是任何序列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: