Datawhale学习计划:python基础知识五

1.file

a.打开文件方式(读写两种方式)

读文件:f = open('./test.txt', 'r')
读二进制文件:f = open('./test.jpg', 'rb')
读取非UTF-8编码的文本文件:
f = open('./gbk.txt', 'r', encoding='gbk')

写文件:f = open('./test.txt', 'w')

b.文件对象的操作方法

f.read(size)
# 读取size字节的文件内容
f.readline()
# 从文件读取一行,包括'\n'字符
f.readlines()
# 读取所有内容,按行返回

f.write(string)
# 将字符串写入文件,返回写入的字符数
f.tell()
# 给出文件的额当前位置,表现为二进制形式下距离文件开头的字节数
f.seek(offset, from_what)
# 移动文件指针到指定位置,offset指偏移量 from_what指参考点
f.close()
# 关闭打开的文件

c.学习对excel及csv文件进行操作

1,python读写csv

import csv

#读取csv文件内容方法1
csv_file = csv.reader(open('testdata.csv','r'))
next(csv_file, None)    #skip the headers
for user in csv_file:
    print(user)

#读取csv文件内容方法2
with open('testdata.csv', 'r') as csv_file:
    reader = csv.reader(csv_file)
    next(csv_file, None)
    for user in reader:
        print(user)

#从字典写入csv文件
dic = {'fengju':25, 'wuxia':26}
csv_file = open('testdata1.csv', 'w', newline='')
writer = csv.writer(csv_file)
for key in dic:
    writer.writerow([key, dic[key]])
csv_file.close()   #close CSV file

csv_file1 = csv.reader(open('testdata1.csv','r'))
for user in csv_file1:
    print(user)

2,python读写excel

import xlrd, xlwt   #xlwt只能写入xls文件

#读取xlsx文件内容
rows = []   #create an empty list to store rows
book = xlrd.open_workbook('testdata.xlsx')  #open the Excel spreadsheet as workbook
sheet = book.sheet_by_index(0)    #get the first sheet
for user in range(1, sheet.nrows):  #iterate 1 to maxrows
    rows.append(list(sheet.row_values(user, 0, sheet.ncols)))  #iterate through the sheet and get data from rows in list
print(rows)

#写入xls文件
rows1 = [['Name', 'Age'],['fengju', '26'],['wuxia', '25']]
book1 = xlwt.Workbook()   #create new book1 excle
sheet1 = book1.add_sheet('user')   #create new sheet
for i in range(0, 3):    
    for j in range(0, len(rows1[i])):
        sheet1.write(i, j, rows1[i][j])
book1.save('testdata1.xls')   #sava as testdata1.xls

2.os模块

1.当前路径及路径下的文件
os.getcwd():查看当前所在路径。
os.listdir(path):列举目录下的所有文件。返回的是列表类型。

2.绝对路径
os.path.abspath(path):返回path的绝对路径。

import os
print(os.getcwd())
print(os.path.abspath('.'))
print(os.path.abspath('..'))

3.查看路径的文件夹部分和文件名部分
os.path.split(path):将路径分解为(文件夹,文件名),返回的是元组类型。
os.path.join(path1,path2,…):将path进行组合,若其中有绝对路径,则之前的path将被删除。

import os
print(os.path.split('./test12.py'))

4.查看文件大小(字节)

import os
print(os.path.getsize('./test12.py'))

5.查看文件是否存在

 os.path.exists(path):文件或文件夹是否存在,返回True 或 False。

3.datetime模块

datetime是Python处理日期和时间的标准库。
1.获取当前的日期和时间
我们先看如何获取当前的日期和时间

from datetime import datetime
now = datetime.now() # 获取当前datetime
print(now)
print(type(now))

2.获取指定日期和时间
要指定某个日期和时间,我们直接用参数构造一个datetime:

from datetime import datetime
dt = datetime(2019, 4, 19, 12, 30) # 用指定日期时间创建datetime
print(dt)

3.把一个datetime类型转换为timestamp只需要简单调用timestamp()方法:

from datetime import datetime
dt = datetime(2019, 4, 19, 12, 30) # 用指定日期时间创建datetime
print(dt.timestamp()) # 把datetime转换为timestamp
#注意Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。

4.timestamp转换为datetime
要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法:

from datetime import datetime
t = 1555648200.0
print(datetime.fromtimestamp(t))
#注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。

5.str转换为datetime
很多时候,用户输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()实现,需要一个日期和时间的格式化字符串:

from datetime import datetime
cday = datetime.strptime('2019-4-19 12:30:00', '%Y-%m-%d %H:%M:%S')
print(cday)

6.datetime加减

对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+和-运算符,不过需要导入timedelta这个类:

from datetime import datetime, timedelta
now = datetime.now()
print(now)
print(now + timedelta(days=10))
print(now + timedelta(hours=10))

7.本地时间转换为UTC时间
本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间指UTC+0:00时区的时间。

#一个datetime类型有一个时区属性tzinfo,但是默认为None,所以无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区:
from datetime import datetime, timedelta, timezone
tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
now = datetime.now()
print(now)
dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
print(dt)

4.类和对象

关于继承和多态请参考我这篇博客

https://blog.csdn.net/fanzonghao/article/details/86592584

5.正则表达式

字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
所以我们判断一个字符串是否是合法的Email的方法是:

1.创建一个匹配Email的正则表达式

用该正则表达式去匹配用户的输入来判断是否合法。

因为正则表达式也是用字符串表示的,所以,我们要首先了解如何用字符来描述字符。

在正则表达式中,如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字,所以:

‘00\d’可以匹配’007’,但无法匹配’00A’;
‘\d\d\d’可以匹配’010’;
‘\w\w\d’可以匹配’py3’;
.可以匹配任意字符,所以:
'py.‘可以匹配’pyc’、‘pyo’、'py!'等等。

2.要匹配变长的字符

在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:

来看一个复杂的例子:\d{3}\s+\d{3,8}。
我们来从左到右解读一下:

 - \d{3}表示匹配3个数字,例如'010';
 - \s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' ',' '等;
 - \d{3,8}表示3-8个数字,例如'1234567'。
综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。
如果要匹配’010-12345’这样的号码呢?由于’-‘是特殊字符,在正则表达式中,要用’‘转义,所以,上面的正则是\d{3}-\d{3,8}。
但是,仍然无法匹配’010 - 12345’,因为带有空格。所以我们需要更复杂的匹配方式。

进阶
要做更精确地匹配,可以用[]表示范围,比如:

[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$表示必须以数字结束。

你可能注意到了,py也可以匹配’python’,但是加上^py$就变成了整行匹配,就只能匹配’py’了。

6.re模块

Python提供re模块,包含所有正则表达式的功能。由于Python的字符串本身也用\转义,所以要特别注意:

s = 'ABC\\-001' # Python的字符串
# 对应的正则表达式字符串变成:
# 'ABC\-001'

因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了:

s = r'ABC\-001' # Python的字符串
# 对应的正则表达式字符串不变:
# 'ABC\-001'

先看看如何判断正则表达式是否匹配:

import re
a=re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
print(a)
b=re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
print(b)

match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:

import re
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
    print('ok')
else:
    print('failed')

切分字符串
用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:

import re
print('a b  c'.split(' '))
print(re.split(r'\s+', 'a b   c'))

编译
当我们在Python中使用正则表达式时,re模块内部会干两件事情:

编译正则表达式,如果正则表达式的字符串本身不合法,会报错;

用编译后的正则表达式去匹配字符串。

如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:

import re
# 编译:
re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
print(re_telephone.match('010-12345').groups())

print(re_telephone.match('010-8086').groups())

编译后生成Regular Expression对象,由于该对象自己包含了正则表达式,所以调用对应的方法时不用给出正则字符串。

7.http请求

import requests
# 发送Get请求
r = requests.get(url = "http://192.168.1.100"+"login?",params = p)
print(r.status_code) # 接口响应的状态码
print(r.text) # 接口的返回数据

参考:

https://blog.csdn.net/Qzx9059/article/details/89080953

https://blog.csdn.net/chendl111/article/details/89104443

猜你喜欢

转载自blog.csdn.net/fanzonghao/article/details/89141939