python基础 Day 5

一、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用来写入,具体的用法参考次这篇文章:

Python读写Excel表格,就是这么简单粗暴又好用

 

二、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秒后超时
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值