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

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

《深入 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. 集合解析

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

集合解析的输入并不一定要是集合; 可以是任何序列。

深入 Python 3 的内容涵盖了 Python 3 及其与 Python 2 的区别。Python 3 提供了一个脚本叫做 2to3。学习它。喜欢它。使用它。用 2to3 移植代码到 Python 3 是一个有关 2to3 工具能够自动整理的所有东西的参考手册。很多这些东西都是语法的变更,因此了解 Python 3 里面许多的语法变更是一个好的起点。(print 现在是一个函数,`x` 不能使用,等等。) 在 HTTP Web 服务这章,httplib2 模块通过 HTTP 获取头信息和数据。HTTP头信息返回的是字符串,而 HTTP 正文则返回的是字节。 在序列化 Python 对象这章,你将了解到为什么 Python 3 里面的 pickle 模块定义了一个和 Python 2 向后不兼容的新的数据类型。(提示:这就是因为字节和字符串的原因。) 同样 JSON也根本不支持字节类型。我将向你展示如何解决这个问题。 在案例分析:移植 chardet 到 Python 3这章,到处都是一大堆一大堆关于字节和字符串的东西。 即使你不关心 Unicode (但实际上你会的),你也会想阅读一下 Python 3 里面的字符串格式,这和 Python 2 里面的完全不一样。 Python 的专家们聪明的把 ElementTree 变成了标准库的一部分 ,然后现在它构成了新的 XML 章节的基础。解析 XML 的那些老的方式仍然可用,但是你应该避免使用它们,因为他们很糟糕! 除此之外,还有个关于 Python 的新东西 — 不是语言上的,而是社区中的 — 像 Python 包装索引(PyPI) 的出现。Python 提供了实 用工具类用来将你的代码打包成标准格式,并分发那些包到PyPI 中。阅读 打包 Python 库了解详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值