一、file
1、打开文件方式(读写两种方式)
读文件
先调用open()方法打开文件,第一个参数是文件路径,第二个‘r’代表read读取,文件不存在会报错
f = open('d://1.txt','r') #假设在d盘根目录有一个名为1的文本
调用read()可以一次性读取所有内容
f.read()
文件读取是放在内存中,所以读取完毕之后要关闭释放内存
f.close()
如果文件读写过程中出错close()方法就不会调用了,python给我们提供了一个方法无论出错与否可以自动关闭
with open('d://1.txt','r') as f:
print(f.read())
#等同于 try finally
如果文件大小很大,一次性读取会占用比较大的内存,如果系统内存不足可能会导致系统奔溃
f.read(size) # 每次读取size个字节内容
f.readline() # 每次读取一行内容
f.readlines() # 一次性读取所有内容按行返回list
写文件
写文件和读文件类似,标识符‘r’要换成‘w’,read换成write
f = open('d://2.txt','w')
f.write('test write')
f.close()
2、文件的对象的操作方法
前面讲的都是对文本的读取,并且默认是UTF-8编码的格式,要读取二进制文件还要用到‘rb’
f = open('d://1.jpg','rb')
f.read() # 会返回十六进制表示的字节
要读取非UTF-8编码的的文本时,要给open传入第三个参数
# errors = 'ignore' 表示忽视编码中的错误,比如一些非法编码
f = open('d://1.txt','r',encoding='gbk',errors='ignore')
3、学习对excel及csv文件进行操作
python对excel的读取主要用到xlrd和xlwt这两个库,xlrd用来读取,wlwt用来写入,具体的用法参考次这篇文章:
二、os模块
os模块实际上是调用操作系统提供的接口函数
>>> import os
>>> os.name # 操作系统类型
'''
Linux、Unix、Mac OS X 显示为:posix
windows 显示为:nt
'''
os.environ # 操作系统环境变量
# 要获取某个环境变量的值 os.environ.get()
>>> os.environ.get('PATH')
>>> os.environ.get('x', 'default')
'default'
操作文件和目录的函数一部分在os模块中,一部分在os.path模块中
# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir') #join是拼接目录
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录,删除成功不会有提示,如果目录不存在会报系统找不到制定的文件
>>> os.rmdir('/Users/michael/testdir')
# split会把最后一段目录或文件名拆分出来
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
# splitext 可以获取文件后缀
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')
三、datetime模块
datetime是python处理日期和时间的标准库
'''
datetime是模块,datetime模块包括datetime类,通过from datetime import datetime导入的才是datetime这个类,如果仅导入import datetime,则必须引用全名datetime.datetime。
datetime.now()返回当前日期和时间,其类型是datetime。
'''
>>> from datetime import datetime
>>> now = datetime.now() # 获取当前datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
>>> print(dt)
2015-04-19 12:20:00
>>> dt.timestamp() # 把datetime转换为timestamp
1429417200.0
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # timestamp转换为datetime
2015-04-19 12:20:00
# timestamp 转换 UTC标准时区
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2015-04-19 04:20:00
# str 转换 datetime
>>> cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
>>> print(cday)
2015-06-01 18:19:59
# datetime 转换 str
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))
Mon, May 05 16:28
# datetime加减
>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
>>> now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
>>> now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
四、类和对象
python 通过class来定义类,class后面是类的名称,括号里继承的类,如果没有继承的类就写object
class Student(object):
pass
类的实例既是对象,实例通过类名+()实现
>>> bart = Student()
>>> bart
<__main__.Student object at 0x0000011E739FD7F0>
>>> Student
<class '__main__.Student'>
# 0x0000011E739FD7F0是内存地址,每个object的地址都不一样,而Student本身则是一个类。
五、正则表达式
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
\d 可以匹配一个数字
\w 可以匹配一个字母或数字
. 可以匹配任意字符
* 表示任意个字符(包括0个)
+ 表示至少一个字符
? 表示0个或1个字符
{n} 表示n个字符
{n,m} 表示n-m个字符
[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线
[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等
[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)
A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'
^表示行的开头,^\d表示必须以数字开头。
$表示行的结束,\d$表示必须以数字结束
六、re模块
re
模块,包含所有正则表达式的功能。由于Python的字符串本身也用\
转义, 使用Python的r
前缀,就不用考虑转义的问题了
s = r'ABC\-001' # Python的字符串
# 对应的正则表达式字符串不变:
# 'ABC\-001'
>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>
# match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
print('ok')
else:
print('failed')
切分字符串
>>> 'a b c'.split(' ')
['a', 'b', '', '', 'c']
分组
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()
表示的就是要提取的分组(Group)
^(\d{3})-(\d{3,8})$
分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
七、http请求
urllib提供了一系列用于操作URL的功能,但是用起来麻烦而且功能简单,建议使用第三方库requests
>>> import requests
>>> r = requests.get('https://www.douban.com/') # 豆瓣首页
>>> r.status_code
200
>>> r.text
r.text
'<!DOCTYPE HTML>\n<html>\n<head>\n<meta name="description" content="提供图书、电影、音乐唱片的推荐、评论和...'
对于带参数的URL,传入一个dict作为params
参数:
>>> r = requests.get('https://www.douban.com/search', params={'q': 'python', 'cat': '1001'})
>>> r.url # 实际请求的URL
'https://www.douban.com/search?q=python&cat=1001'
requests自动检测编码,可以使用encoding
属性查看:
>>> r.encoding
'utf-8'
无论响应是文本还是二进制内容,我们都可以用content
属性获得bytes
对象:
>>> r.content
b'<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n...'
requests的方便之处还在于,对于特定类型的响应,例如JSON,可以直接获取:
>>> r = requests.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json')
>>> r.json()
{'query': {'count': 1, 'created': '2017-11-17T07:14:12Z', ...
需要传入HTTP Header时,我们传入一个dict作为headers
参数:
>>> r = requests.get('https://www.douban.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})
>>> r.text
'<!DOCTYPE html>\n<html>\n<head>\n<meta charset="UTF-8">\n <title>豆瓣(手机版)</title>...'
要发送POST请求,只需要把get()
方法变成post()
,然后传入data
参数作为POST请求的数据:
>>> r = requests.post('https://accounts.douban.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})
requests默认使用application/x-www-form-urlencoded
对POST数据编码。如果要传递JSON数据,可以直接传入json参数:
params = {'key': 'value'}
r = requests.post(url, json=params) # 内部自动序列化为JSON
类似的,上传文件需要更复杂的编码格式,但是requests把它简化成files
参数:
>>> upload_files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=upload_files)
在读取文件时,注意务必使用'rb'
即二进制模式读取,这样获取的bytes
长度才是文件的长度。
把post()
方法替换为put()
,delete()
等,就可以以PUT或DELETE方式请求资源。
除了能轻松获取响应内容外,requests对获取HTTP响应的其他信息也非常简单。例如,获取响应头:
>>> r.headers
{Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}
>>> r.headers['Content-Type']
'text/html; charset=utf-8'
requests对Cookie做了特殊处理,使得我们不必解析Cookie就可以轻松获取指定的Cookie:
>>> r.cookies['ts']
'example_cookie_12345'
要在请求中传入Cookie,只需准备一个dict传入cookies
参数:
>>> cs = {'token': '12345', 'status': 'working'}
>>> r = requests.get(url, cookies=cs)
最后,要指定超时,传入以秒为单位的timeout参数:
>>> r = requests.get(url, timeout=2.5) # 2.5秒后超时