python玩转数据

Posted by Felix Zhang on 2020-04-19
Words 2.8k and Reading Time 10 Minutes
Viewed Times

MODULE 0

走进python

hello world

1
2
mystring = 'hello world'
print(mystring)

运行程序:(1)交互式解释器shell(2)文件(以.py为扩展名)

安装第三方库: pip install (库名)

输出:利用Print函数 参数为变量名or字符串

输入:Input函数 变量名 = 变量类型( input(‘提示语句’))

python风格

注释:#开头表示

换行:三引号下的数据可以不用加换行符号;

缩进:不需要括号,直接用冒号,然后控制缩进;

python语法基础

变量:标注对象or引用对象;变量名命名受C语言影响:首字母必须是字母or下划线;其余可以是字母、下划线、数字;大小写敏感;尽量避免下划线开头的变量名;尽量不使用拼音,使用英文;驼峰式、下划线式不混用;关键字不可用做变量名;

运算符有优先级顺序,表达式一定要有运算结果;

赋值:python是动态强类型语言,通过引用的方式赋值,无需显式声明变量类型;可用id()函数查看内存空间;[-5,256]范围内的数字可以存储在同一内存空间,方便使用;增量赋值,链式赋值,多重赋值;

1
2
3
#多重赋值的本质是元组打包、序列解包
x,y = y,x
PI, r = 3.1415926, 3

语句:用于完成一个任务;表达式:任务中的一步;

Python数据类型

(1)整型(int):Python中整型基本不存在溢出问题

(2)布尔型(bool):其实整型的一个子类,只有true\false两个值,本质上也是由1\0存储的

(3)浮点型(float):数学中的实数,用类似科学计数法表示

(4)复数型(complex):虚数部分用$j$标记,可以使用.real和.imag分别取得实数和复数部分,可以用.conjugate获得共轭复数

(5)字符串:可使用单引号、双引号和三引号(三个单引号)鉴别,三引号中可以自由使用单引号和双引号;可以使用索引操作符,可以使用+将两个字符串连接在一起;

(6)映射类型-字典:用大括号来鉴别,成员是有键和值成对的对象,类似于哈希表的键值对;

Python基本运算

(1)算术运算:+、-、、/、*(乘方运算)、%(取余)、//(整除)

(2)比较运算:Python可以使用连续的比较运算;>、<、==、!=;

(3)逻辑运算:not \ and \or (与C++中不一样,Python中可直接使用中文)

(4)字符运算符:r\R表示原始字符串,用于一些不需要转义自负的地方

比较运算和逻辑运算的结果为bool型的值;

Python的函数、模块

(1)函数:完成特定功能的一段代码;

内建函数:数值型内建函数、实用函数;可用help()查看某个内建函数的信息;

1
2
round(),四舍五入取整;(内建函数)
floor(),向下取整(需import math)

标准库函数(Python标准支持,需要倒入模块)、第三方库(需安装)、用户自定义(自行设计)

1
2
import <模块名1><模块名2>
from <模块名> import <模块部分>

包(Package)

1
2
一个有层次的文件目录结构;
定义了一个由模块和子包组成的Python应用程序执行环境;

库(library)

1
一组模块集合

print可以支持同时输出多个变量;

1
runfile(),

MODULE 1

三种结构:顺序、选择、重复

条件

1
2
3
4
5
6
7
8
if <条件表达式>:
<执行语句>
elif <条件表达式>:
<执行语句>
elif <条件表达式>:
<执行语句>
else:
<执行语句>

另外,还可以使用条件嵌套和条件返回式;

1
x if <expression> else y

range()函数:用于产生一组有规矩的数列

1
2
3
4
5
range(start, end, step)
range(start, end)
range(end)
#包含起始值,不包含终止值,默认步长为1,起始值为0
#循环中使用较多,适合与for连用

循环

1
2
3
4
5
6
7
while <expression>:
<expression>
#while循环在条件满足时循环
for iter_var in iterable_object:
suite_to_repeat
#获取可迭代对象,产生迭代器;可以用作列表解析与生成表达式,还可以遍历数据集
#索引迭代seq[i]、序列本身迭代

for循环是一个语法糖:将复杂的语法规则内含化;

1
2
3
4
5
6
7
8
9
#最大公约数
def gcd(x, y):
if x < y:
x, y = y, x
while x % y != 0:
r = x%y
x = y
y = r
return y

其它语句

1
2
3
break:跳出当前循环,提前终止;
continue: 条件满足时跳过continue后的语句,停止当前,进入下一轮;
else: 如果循环从break截止,无法执行;若是正常结束的,则会执行else语句;

素数的计算机定义:如果无法被2到sqrt(N)之间的数整除,则为素数

自定义函数

1
2
3
4
def <函数名>(<参数>):#相比于C++,python中不用写出参数的数据类型
'<函数的注释>'#可以用print(<函数名>)调用
<函数体>
#最后一定要有return

默认参数

(1)程序中若需要有默认参数,直接用赋值语句写出;

(2)默认参数可修改

1
2
def f(x, y = True)
>>> f(68,False)#改变默认参数y的值

(3)默认参数后面不允许跟上非默认参数,故默认参数一定要放到最后;

关键字参数

1
2
def f(x,y):
f(y = , x = )#直接引用关键字参数赋值

一旦使用了关键字参数,则所有的参数都需使用为关键字参数

传递函数

函数可以像参数一样传递给另外一个函数;

lambda函数(匿名函数)

1
2
def my_add(x,y): return x+y
my_add = lambda x,y: x + y

递归

(1)递归一定要有停止条件

(2)递归的系统消耗更大,一层一层调用,一层一层返回

有些问题找不到合适的循环方案,则只有使用递归的方法

变量作用域

全局变量:位于代码的主题部分,函数内和主体部分都可见

局部变量:函数模块中的变量

若全局变量和局部变量同名,则遵循“内层屏蔽外层”的原则。函数内部也可修改全局变量的值。

1
global a#声明a为一个全局变量

常用python标准库函数

可用dir(<模块名>)查看其中的函数

math模块

1
2
3
4
5
6
7
8
9
10
import math
math.pi#常数
math.e#常数
help(<函数名>)#了解函数功能
math.ceil()#向上取整
math.floor()#向下取整
math.pow(,)#幂运算
math.sqrt()#开方运算
math.degrees()#弧度转角度
math.radians()#角度转弧度

os模块:与操作系统交互

1
2
3
4
5
import os
os.getcwd()#获得当前工作目录
os.chdir()#更改目录
os.rename(,)#重命名
os.remove()#删掉文件

random模块:随机数生成

1
2
3
4
5
6
7
8
import random
random.choice([,,])#从序列中获得随机值
random.randint(start, end)#生成随机整数
random.randrange(start, end, step)#获取随机正数
random.random#生成0到1.0之间的随机浮点数
random.uniform(start, end)#生成start到end的随机浮点数
random.simple(range(), num)#在范围内随机生成num个随机数
random.shuffle([,,])#将列表中的元素打乱,适合抽签

datetime模块

1
2
3
4
5
6
7
8
9
10
from datetime import date
dt = date.today()#
from datetime import time
tm = time(23,20,25)#生成23:20:25这个时间
from datetime import datetime
dt = datatime.now()#本地时间,精确至毫秒
print(dt.strftime("%a, %b %d %Y %H:%M"))
dt = datatime(2017,6,6,23,29)#生成时间
ts = dt.timestamp()#转化成时间戳
dt = datatime.fromtimestamp(ts)#重新转为当前时间

异常

错误分类:语法错误,运行时刻错误,逻辑错误

Python通常用异常对象表示异常;若无法捕捉异常对象,则会回溯找到异常出现点;

1
dir(_builtins_)#查看异常类
1
2
3
4
5
6
7
8
9
10
11
12
#try_except
try:
<被检测的语句块>
except <异常类> as <错误原因名(自定义)>:
<执行语句>
else:#没有except引发产生的语句
<执行语句>
finally:#任何情况下,finally都会执行
<执行语句>
#还可以使用多个except语句捕捉多个异常
#也可以直接使用空的except语句
#可以使用while True语句 + break使得知道正常时结束运行

操作文件时一般推荐使用with语句;

MODULE 2 数据获取

本地数据获取

打开文件-读取数据-写入数据-关闭文件

1
2
3
#使用open函数,文件名(包含路径信息),模式,大小(后两个参数是必须的)
file_obj = open(filename, mode = 'r', buffering = -1, )
#mode: r读文件,w写文件(会清空原有内容),a追加(在尾部增加);后面如果加b就表示二进制文件的操作

open()函数返回一个文件对象,文件对象可迭代,

1
2
3
4
5
#对象名.方法
f.read(), f.write(), f.close(), f.seek()
#write函数可以将一个字符串写入文件
#read函数:不带参数则表示从当前位置读到结尾,用字符串返回;带参数
#readlines读取多行数据,writelines写入多行数据

with语句在执行后会直接关闭文件,则无需继续使用close关闭文件;

python在读取文件时不会自动删除换行符;

读写时共用同一个文件指针,数据从指针所在位置开始读写;seek函数可移动指针解决上述问题:seek函数有两个参数,一个表示偏移量,一个表示起始位置(默认值为0);seek(5,0)表示从文件开头移动至5个位置处;

统计文件中的行数

1
2
3
4
5
6
7
8
9
10
11
try:
with open('file_name') as f:
data = f.readline()
except:
print(file_name + 'does not exist')
lens = len(data)
print('the data has' + str(lens) + 'lines')
#如果需要使用多个数据,则定义一个新的函数
files = ['date1.txt','data2.txt','data3.txt','data4.txt']
for fname in files:
count(fname)
1
2
3
4
5
6
7
8
9
path = '../data'
for fname in os.listdir(path):
if (fname.endswith('txt')):#表示文件格式,此处只会读取.txt文件
file_path = os.path.join(path, fname)
count(file_path)

if os.path.exists('./output'):
shutil.rmtree('./output') #可以递归的删除非空目录
os.mkdir('./output')#可以创建自己的目录

网络数据获取

(1)抓取:urllib内建模块、Requests第三方库、Scrapy框架

(2)解析:BeautifulSoup库,re模块

Requests库:网页抓取

(查看爬虫协议:robots.txt,只有允许部分才可爬取)

1
2
3
4
5
6
7
8
r = requests.get('<网站名>')
r.status.code #查看状态码
#若数据是二进制
r.content
#若数据是js生成的
r.json
r.text
r.encoding = ''#更改编码

动态生成的页面可能无法使用requests

网页数据解析

(1)Beautifulsoup库:适用于有标签标记的数据

1
2
3
4
5
from bs4 import Beautifulsoup
markup = '<字符串>'#记录标记
soup = Beautifulsoup(markup,'lxml')#
soup.b#对标签b类对象(tag)的访问
soup.find_all('b')#可以找到所有被标签(tag)的内容,返回的是一个列表

(2)re正则表达式模块处理:对于细则上比较复杂的数据提取

序列


This is copyright.