高级Python
李金的中文Python笔记[https://github.com/lijin-thu/notes-python]的学习笔记及摘要。
与操作系统进行交互:os 模块
import os
文件路径操作
os.remove(path)
或os.unlink(path)
:删除指定路径的文件。路径可以是全名,也可以是当前工作目录下的路径。os.removedirs
:删除文件,并删除中间路径中的空文件夹os.chdir(path)
:将当前工作目录改变为指定的路径os.getcwd()
:返回当前的工作目录os.curdir
:表示当前目录的符号os.rename(old, new)
:重命名文件os.renames(old, new)
:重命名文件,如果中间路径的文件夹不存在,则创建文件夹os.listdir(path)
:返回给定目录下的所有文件夹和文件名,不包括'.'
和'..'
以及子文件夹下的目录。('.'
和'..'
分别指当前目录和父目录)os.mkdir(name)
:产生新文件夹os.makedirs(name)
:产生新文件夹,如果中间路径的文件夹不存在,则创建文件夹
os.path 模块
不同的操作系统使用不同的路径规范,这样当我们在不同的操作系统下进行操作时,可能会带来一定的麻烦,而 os.path 模块则帮我们解决了这个问题。
import os.path
测试
os.path.isfile(path)
:检测一个路径是否为普通文件os.path.isdir(path)
:检测一个路径是否为文件夹os.path.exists(path)
:检测路径是否存在os.path.isabs(path)
:检测路径是否为绝对路径
split 和 join
os.path.split(path)
:拆分一个路径为(head, tail)
两部分os.path.join(a, *p)
:使用系统的路径分隔符,将各个部分合成一个路径
其他
os.path.abspath()
:返回路径的绝对路径os.path.dirname(path)
:返回路径中的文件夹部分os.path.basename(path)
:返回路径中的文件部分os.path.splitext(path)
:将路径与扩展名分开os.path.expanduser(path)
:展开'~'
和'~user'
CSV 文件和 csv 模块
import csv
读 csv 文件
假设我们有这样的一个文件:
%%file data.csv
"alpha 1", 100, -1.443
"beat 3", 12, -0.0934
"gamma 3a", 192, -0.6621
"delta 2a", 15, -4.515
data = []
with open('data.csv') as fp:
r = csv.reader(fp)
for row in r:
data.append([row[0], int(row[1]), float(row[2])])
data
>>>
[['alpha 1', 100, -1.443],
['beat 3', 12, -0.0934],
['gamma 3a', 192, -0.6621],
['delta 2a', 15, -4.515]]
写 csv 文件
data = [('one, \"real\" string', 1, 1.5), ('two', 2, 8.0)]
with open('out.psv', 'wb') as fp:
w = csv.writer(fp, delimiter="|") # 可以更换分隔符
w.writerows(data)
!cat 'out.psv'
>>>
"one, ""real"" string"|1|1.5
two|2|8.0
其他选项
numpy.loadtxt()
和 pandas.read_csv()
可以用来读写包含很多数值数据的 csv
文件。其中使用 pandas
进行处理,生成一个 DataFrame
对象:
import pandas
df = pandas.read_csv('trades.csv', index_col=0)
print df
正则表达式和 re 模块
import re
re.match & re.search
在 re
模块中, re.match
和 re.search
是常用的两个方法:
re.match(pattern, string[, flags])
re.search(pattern, string[, flags])
两者都寻找第一个匹配成功的部分,成功则返回一个 match
对象,不成功则返回 None
,不同之处在于 re.match
只匹配字符串的开头部分,而 re.search
匹配的则是整个字符串中的子串。
正则表达式规则
正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义:
子表达式 | 匹配内容 |
---|---|
. | 匹配除了换行符之外的内容 |
\w | 匹配所有字母和数字字符 |
\d | 匹配所有数字,相当于 [0-9] |
\s | 匹配空白,相当于 [\t\n\t\f\v] |
\W,\D,\S | 匹配对应小写字母形式的补 |
[...] | 表示可以匹配的集合,支持范围表示如 a-z , 0-9 等 |
(...) | 表示作为一个整体进行匹配 |
¦ | 表示逻辑或 |
^ | 表示匹配后面的子表达式的补 |
* | 表示匹配前面的子表达式 0 次或更多次 |
+ | 表示匹配前面的子表达式 1 次或更多次 |
? | 表示匹配前面的子表达式 0 次或 1 次 |
{m} | 表示匹配前面的子表达式 m 次 |
{m,} | 表示匹配前面的子表达式至少 m 次 |
{m,n} | 表示匹配前面的子表达式至少 m 次,至多 n 次 |
例如:
ca*t 匹配: ct, cat, caaaat, ...
ab\d|ac\d 匹配: ab1, ac9, ...
([^a-q]bd) 匹配: rbd, 5bd, ...
datetime 模块
datetime 格式字符表
字符 | 含义 |
---|---|
%a | 星期英文缩写 |
%A | 星期英文 |
%w | 一星期的第几天,[0(sun),6] |
%b | 月份英文缩写 |
%B | 月份英文 |
%d | 日期,[01,31] |
%H | 小时,[00,23] |
%I | 小时,[01,12] |
%j | 一年的第几天,[001,366] |
%m | 月份,[01,12] |
%M | 分钟,[00,59] |
%p | AM 和 PM |
%S | 秒钟,[00,61] (大概是有闰秒的存在) |
%U | 一年中的第几个星期,星期日为第一天,[00,53] |
%W | 一年中的第几个星期,星期一为第一天,[00,53] |
%y | 没有世纪的年份 |
%Y | 完整的年份 |
SQL 数据库 05.06-sql-databases
待深入学习
对象关系映射
数据库中的记录可以与一个 Python 对象对应。
待深入学习
函数进阶:参数传递,高阶函数,lambda 匿名函数,global 变量,递归
默认参数是可变的!????
匿名函数
为了方便,对一些简单的函数,我们通常使用匿名函数的方式进行处理,其基本形式是:lambda <variables>: <expression>
print(map(lambda x: x * x, range(5)))
>>>
[0, 1, 4, 9, 16]
map(f, sq)
函数将 f
作用到 sq
的每个元素上去,并返回结果组成的列表,相当于:
[f(s) for s in sq]
迭代器
有些情况下,我们既希望获得下标,也希望获得对应的值,那么可以将迭代器传给 enumerate
函数,这样每次迭代都会返回一组 (index, value)
组成的元组:
x = [2, 4, 6]
for i, n in enumerate(x):
print 'pos', i, 'is', n
>>>
pos 0 is 2
pos 1 is 4
pos 2 is 6
字典对象的 iterkeys, itervalues, iteritems
方法返回的都是迭代器:
x = {'a':1, 'b':2, 'c':3}
i = x.iteritems()
print i
>>>
<dictionary-itemiterator object at 0x0000000003D51B88>
生成器
def generator(...):
<do setup>
while True:
<generate value>
# yield 说明这个函数可以返回多个值!
yield value
if <done>:
break
生成器使用 yield
关键字将值输出,而迭代器则通过 next
的 return
将值返回;与迭代器不同的是,生成器会自动记录当前的状态,而迭代器则需要进行额外的操作来记录当前的状态。
对于之前的 collatz
猜想,简单循环的实现如下:
def collatz(n):
sequence = []
while n != 1:
if n % 2 == 0:
n /= 2
else:
n = 3*n + 1
sequence.append(n)
return sequence
for x in collatz(7):
print(x)
>>>
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
迭代器的版本如下:
class Collatz(object):
def __init__(self, start):
self.value = start
def __iter__(self):
return self
def next(self):
if self.value == 1:
raise StopIteration()
elif self.value % 2 == 0:
self.value = self.value/2
else:
self.value = 3*self.value + 1
return self.value
for x in Collatz(7):
print(x)
>>>
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
def collatz(n):
while n != 1:
if n % 2 == 0:
n /= 2
else:
n = 3*n + 1
yield n
for x in collatz(7):
print(x)
>>>
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
with 语句和上下文管理器
with open('my_file', 'w') as fp:
# do stuff with fp
data = fp.write("Hello world")
等效于下面的代码:
fp = open('my_file', 'w')
try:
# do stuff with f
data = fp.write("Hello world")
finally:
fp.close()