- csv 文件用python读取相关命令和方法:
####################################################################
import csv
def read_csv_demo1():
with open('iris.csv','r+',encoding='utf-8') as fp:
reader = csv.reader(fp)
title = next(reader)
for x in reader:
score = x[3]
re = x[4]
type = x[5]
print({'reader':score,'re':re,'type':type})
def read_csv_dic():
with open('iris.csv','r',encoding='utf-8') as fp:
reader_dict = csv.DictReader(fp)
for x in reader_dict:
value = {"hight":x.get['Sepal.Length',None],"Species":x['Species']}
## 用get的好处是 可以拿到一个默认值
print(value)
def write_csv_normal():
headers = ['username','password']
values = [
{'张三':23},
{'李四':34},
{'王五':5}
]
values1 = [
('张三',23),
('李四',34),
('王五',5)
]
with open('create.csv','w',encoding='utf-8',newline='') as fp:
### newline 表示用空字符代替回车 不然会出现空行
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values1)
def csv_dic_wirte():
headers = ['username','age','password']
values = [
{'username':'张三','age':34,'password':123},
{'username':'lisi','age':34,'password':123},
{'username':'wangwu','age':34,'password':123},
dict('username'=wangwu','age'=34,'password'=123),
dict('username'='zhangf','age'=34,'password'=123)
## dict的方式也可以实现 dict侯敏就是用院子的方式
]
with open('create1.csv','w+',encoding='utf-8',newline='') as pf:
write = csv.DictWriter(pf,headers)
write.writeheader()
write.writerows(values)
print(write)
if __name__ == '__main__':
# read_csv_demo1()
csv_dic_wirte()
## excel xls文件读取:
import xlrd
def xl_read():
'''excel读取'''
book = xlrd.open_workbook('product.xls')
for sheet in book.sheets():
print(sheet.name)
def xl_read_data():
"""读取数据"""
book = xlrd.open_workbook('product.xls')
sheet = book.sheet_by_name('Porduct')
print('工作簿:{}'.format(sheet.name))
print('数据行数:{}'.format(sheet.nrows))
print("产品数据:")
for i in range(sheet.nrows):
print(sheet.row_values(i)) # 索取索引指定的数据行
if __name__ == '__main__':
xl_read()
- Json 和 python数据的转换方法:
##############################################################
import json
person = [
{
'usernam':'老师',
'age':10
},
{
'usernam':'nihao',
'age':20
}
]
方式1:
print(type(person))
json_str = json.dumps(person) ## 把python列表变成json的方式就是 dumps ,dumps不能直接存储到文件
# 其中 dump后面的S不是表示复数 而是表示str变成 json形式的string
json_data = json.loads(json_str) # 他们都是可以互转的
with open('person.json','w') as fp:
fp.write(json_str)
data_json = json.dumps(dict(item),ensure_ascii = False) # 表示把item变为dict形式,然后中文用unicode存储
方式2:
with open('person1.json','w',encoding='utf-8') as fp:
json.dump(person,fp,ensure_ascii=False)
## 这里面dump是没有s的表示是写入到文件中而不是 变成str所以不用s
"""json字符串load成python对象 ,load 直接读取文件和文件有关系,loads是通过传入的转换和文件没有关系
json_str = '[{"usernam": "老师", "age": 10}, {"usernam": "nihao", "age": 20}]'
name = json.loads(json_str,encoding='utf-8')
print(type(name))
print(name)
with open('person.json','r',encoding='utf-8') as fp:
json_str_load = json.load(fp)
## 此时load后面也咩有s了,因为是到问津不是到str
print(json_str_load)
def json_type_diff():
'''类型差异'''
data = {
'Discontinued': False,
'Title':'iphone7s',
'Catatory':None,
'Price':5999.00
}
print(json.dumps(data))
if __name__ == '__main__':
json_type_diff()
## 体现在false 和null 两个方面
-
python 函数zip 的分组方法:
#######################################################
"""
zip 的作用是:titles = [1,2,3] dynasties = ["p","e","i"] zip(titles,dynasties) = [1,"p"],[2,"e"],[3,"i"] for i in zip(titles,dynasties) , i1 = [1,"p"],i2 = [2,"e"] titles, dynasties = vlaue 就是相当于 title =1, dynasties="p"
"""
for vlaue in zip(titles, dynasties, authors, contents): titles, dynasties, authors, contents = vlaue peom = { 'title': titles, 'dynasty': dynasties, 'author': authors, 'contents': contents } poems.append(peom)
-
关于数字替换的方法
###################################
i =0 -----> 00000
i= 10 ------> 00010
i =100 ----->00100url = "https://youku.com-iqiyi.net/20190121/21210_8a9a98dc/1000k/hls/0d80d01613100%05d.ts"%(i)
表示 5 个字符 用i替换里面的内容向前替换
读取到文件内容并把内容存储到指定文件中,同时截取url的一段变成文件名url = "https://youku.com-iqiyi.net/20190121/21210_8a9a98dc/1000k/hls/0d80d01613100%04d.ts"%(i) try: re = requests.get(url) except: print(f"{i}网址有问题!!") count = count+1 list.append(i) ret = re.content print("开始下载第%s页面"%i) with open(f"./AiqiyiDownloadDirectory/{url[-10:]}",'wb') as fp: fp.write(ret) print("第%s页面下载完成" %i)
-
使用多线程方法启动多个爬虫任务:
########################################################def download(i): pass if __name__ == '__main__': mu_pool = Pool(18) for i in range(1002,1703): mu_pool.apply_async(download,args=(i,)) mu_pool.close() mu_pool.join()
-
学习一个爬虫中scroll down 下拉条的循环
#######################################################for x in range(1, 11, 2): time.sleep(0.5) j = x / 10 print(x) print(j)
- 监控机器的相关运行状态,并通过函数调用循环执行:
####################################################import psutil import time import datetime from threading import Timer from apscheduler.schedulers.blocking import BlockingScheduler
def montiorsystem():
# 获取cpu使用情况
cpuper = psutil.cpu_percent()
# 获取内存使用情况:系统内存大小,使用内存,有效内存,内存使用率
mem = psutil.virtual_memory()
# 内存使用率
memper = mem.percent
# 获取当前时间
now = datetime.datetime.now()
# 获取网络收信息
netinfo = psutil.net_io_counters()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
line = f'"time":{ts},"cpu":{cpuper}%, "mem":{memper}%, "bytessent"={netinfo.bytes_sent}, "bytesrecv"={netinfo.bytes_recv}\n'
print(line)
with open('logfile','a',encoding='utf-8') as fp:
fp.write(line)
# Timer(3, montiorsystem).start
def MonitorNetWork():
netinfo = psutil.net_io_counters()
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
line = f'{ts} bytessent={netinfo.bytes_sent}, bytesrecv={netinfo.bytes_recv}'
print(line)
with open('logfile', 'a', encoding='utf-8') as fp:
fp.write(line)
` # Timer(1, MonitorNetWork).start`
# def loopmonitor():
# while True:
# montiorsystem(r'logfile')
# time.sleep(2)
x = 'youaremybestfirend'
n = 0
while x:
print(x,f'当前是第{n}次循环',end=' ')
n = n+1
print('\n')
x = x[1:]
x 和 l 列表一样只要有数值 就永远为真,x = 0 或是 l 为空 或是None时就位false
def dojob_APScheduler():
apsch = BlockingScheduler()
apsch.add_job(montiorsystem,'interval',seconds=2,id='1')
apsch.add_job(MonitorNetWork,'interval',seconds=2,id='2')
apsch.start()
if __name__ == '__main__':
logfile = r'C:\Users\user\PycharmProjects\s14\logfile'
dojob_APScheduler()
8 ########################### lamdba,map 表达式用法 ########
map(lamdba x:response.urljoin(x),urls)
Urls 是返回的一个列表,把urls中的url遍历出来, 随后给到lamdba表达式;
lamdba是一个匿名函数,然后把每一个遍历出来的url给到lamdba中的url部分作为形参传入,并执行response.urljoin(url)函数;
然后把response.urljoin(url)函数 的返回值, 返回去组成一个新的列表。 但是用了map函数后,所有的列表变成了map对象。 所有要把map对象变成list的方法就是外面加上list函数, 通过下面的方法就可以拿到完成的url拼接李彪
list(map(lamdba x:response.urljoin(x),urls))
def double_num(x):
return x+10
l = [1,2,3]
res5 = list(map(double_num,l))
print(res5)
map函数 第一个是func 后面是应用到那个列表上或是数值上,list把map从对象变成列表
9 ################### pycharm 编码问题 ##########
python3:
# -*- coding:utf-8 -*-
import importlib,sys
importlib.reload(sys)
点开 file > settings > File Encodings > global encoding GBK, Porject encoding GBK
10 ################### 字典 列表 字符转换 ##########
dict = {'runoob': 'runoob.com', 'google': 'google.com'}
print(dict)
str_b = str(dict)
str_b.upper()
str_b.split(',')
print(str_b.split(',')[0].split(':')[1])
#通过readlines方法变成列表,但是在内存中占用空间,所以一般不用readlines,而只是用迭代器生成 l = open('hello.txt', 'r') :
所以 可迭代对象 只需要一点点内存,但是列表的话要占用更多内存把数据全部遍历完毕
l = open('hello.txt', 'r').readlines()
print(l)
###列表本身没有实现迭代器,所以用iter(s1) is s1判断应该为false,那么通过iter的方式实现一个迭代,就可以用next方法; 但是为什么在for循环列表时确实可以的呢,因为for执行时自动调用了iter的方法自动实现了迭代。
文件读取对象已经实现了iter方法。
s1 = ['youpinnihao.com','nihao']
print(iter(s1) is s1)
i = iter(s1)
print(i.__next__())
print(next(i))
f = open('ip.text')
print(iter(f) is f)
print(f.__next__())
print(next(f))
![]
## 通过pickle方法把原来的数据类型放入到文件中,然后在读出来,json.dump是对数据类型进行json的转换###
import pickle
d = {'name':'zhangsan','age':23}
f = open('datafile.pkl','wb')
pickle.dump(d,f)
f.close()
# f = open('datafile.pkl','rb').read()
f = open('datafile.pkl','rb')
data = pickle.load(f)
print(data['name'])
f.close()
把列表变为字符串的方法,同时又join的使用方法
b = ['a','b','c']
print(type(b))
b = 'nihyao'.join(b)
print(type(b))
print(b)
######## is 的用法 ####
c = 'abc.com.abc1234511111111'
d = 'abc.com.abc1234511111111'
print(c==d)
print(c is d)
在内存中 把相同的字符的内存地址赋值给不同的变量
a,b,*c = 'ukli.com'
print(c)
*c 表示后面的所有的内容* 返回都是列表
a,b = [],[]
a.append(3)
print(c,d,sep='|',end='......\n',file=open('result.txt','w',encoding='utf-8'))
def update(x):
print(x*3)
operation = {
'add': '执行添加操作',
'delete':lambda x:print(x-1),
'update':update
}
def default_method(x):
print('默认方法')
print(operation.get('add'))
operation.get('delete',default_method)(10)
operation.get('update',default_method)(15)
operation.get('updadddte',default_method)(15)
字典中客户直接写函数表达式,传递的一个函数名称 后面再赋值
####### 三元运算 ###
score = 75
result = '及格' if score >= 60 else '不及格'
print(result)
print(a = Y if X else Z)
目的就是为了给a赋值,如果X的条件成立 a = Y , 如果条件不成立 a=Z
####### 打印字典 get方法同时为没有找到的内容赋值 ###
emp = {
'name':'tom',
'department':'tech',
'job':'dev',
'salary':9000
}
for key in emp:
# print('{} ---> {}'.format(key,emp.[key]))
print('{} ---> {}'.format(key, emp.get(key,'未找到')))
s1 = 'youpinnihao.com'
s2 = 'iyunile.cn'
l = [x for x in s1 if x in s2]
print(l)
找出相同内容的方法 x for x in s1 表示s1的所有值放到把列表中,x如果是在s2中付给l
s1 = 'youpinnihao.com'
x = s1.find('om')
print(s1[x:])
for (inx,item) in enumerate(s1):
print('{} , {}'.format(inx,item))
其实在for循环中的 inx和item就是一个元祖,只是元祖在默写情况下可以省略,字符串中的find方法是找此字符中的符合字母要求的第一个数值的下标
import sys
print(sys.version,sys.platform)
打印python的版本信息
for
s1.__next__()
next(f)
有哪些是可以for循环得到的呢,就是通过__next__() 的方法实现迭代的都可以用for进行取值,for循环的本质就是通过调用next的方法实现 所以可以迭代的都是可以用for的,可迭代的本质是next()方法
推导的方法使用:内部是用c编译效率更高, 下面表示 在i中循环 x取到的数值平方,然后给到列表中第一部分就是取到的数值的如何内容,[]表示用列表存储
同时在列表后面可以用过if判断 res4 = [url for url in s1 if url.endswith('.com')],对于取到的数据判断和过滤。
对取到的数值可以进行转换 res3 = [url.upper() for url in s1]
所以可迭代对象都是可以通过推导得到
i = [1,2,3]
result = [x**2 for x in i]
print(result)
s1 = ['youpinnihao.com','nihao']
res3 = [url.upper() for url in s1]
res4 = [url for url in s1 if url.endswith('.com')]
print(res3)
print(res4)
x= 101
def func():
global x
x = 100
def nested():
# nonlocal x # global和nonlocal不能同时出现,nonlocal标识外部的不是全局的
x = 99
print(x)
nested()
print(x)
print(x)
func()
print(x)
参数的作用域,可以用global和nonlocal 字段来标识
def change_list(l):
l[0] = 99
l = ['cctv.com','henan.tv','beijing.tv']
print('original list:', l)
# change_list(l)
change_list(l.copy())
print('after operation:',l)
列表传递是可变数据类型,所以数据会发生变化
对于 字符串 数字 元祖是不可变数据类型,所以在传递数值时,只是传递的数据的copy,所以数值不变
def display(**employee):
print(employee)
a = display
# 函数名表示不用执行,如果放了()表示立刻要执行
Alt+F8 做代码格式化
通过字典放入函数执行不同的方法,此时方法的()需要注意,'c':hello_chinese,以及最后调用时 oper.get(lanage,hello_chinese)(name)
def hello_chinese(name):
print('你好',name)
def hello_jap(name):
print('jjjjj',name)
oper = {
'c':hello_chinese,
'j':hello_jap,
'e': lambda name:print('hello',name)
}
while True:
name = input('输入名字吧: \n')
if name == 'stop':
break
lanage = input('请输入语言版本: \n c=> 中文 \n j ==> 日文 \n e ==> 英文')
oper.get(lanage,hello_chinese)(name)
###########这个可以变成下面的方法,封装成一个方法动态的实现:
def hello_chinese(name):
print('你好',name)
def hello_jap(name):
print('jjjjj',name)
oper = {
'c':hello_chinese,
'j':hello_jap,
'e': lambda name:print('hello',name)
}
def hello(action,name):
action(name)
hello(hello_jap,'zhangsan')
综合的一个例子实现 一个函数的三个方法对比
l = list(range(1,10))
res = []
def add_num(x):
return x+5
##方法 1:循环
for i in l:
res.append(i)
##方法 2, 推导 ** 此方法最高效
res = [ x+5 for x in l ]
## 方法3,map() 最灵活 可以直接用lambda写
res = list(map(add_num,l))
res = list(map(lambda x:x**2,l))
print(res)
此时关于filter的函数用法:
l = list(range(1,10))
def even_num(x):
return x%2 ==0
res = filter(even_num,l)
for n in res:
print(n,end=' ')
from models import test as m_test
import models1
from models1.test as m_test
import imaplib
imaplib.reload(models1)
## 这样可以在moduels1中发生改变的东西 在执行时自动的导入到当前的模块中
## reload只认识模块,所以只能用 import models1 对应
11类和面向对象
通过book1来实例化对象,book1 =Book()其实就是说 调用了 Book类中的init方法来初始化, Book类本身是没有()的,所以这个就是init的意义.
self表示在每个实例化对象时并不知道传过来的是book1还是book2,所以先用self表示要实例化的内容 book1 book2.。。。。。。
import datetime
class Book:
count = 0 # 所有和实例无关的不要放到__init__里面,但是和这个程序有关的就不要放到class的外面,下面调用的话 也是用类进行调用Book.count +=1 来表示统计当前多少个图书; self就是和实例有关
def __init__(self,title,price=0.0,author='',publisher=None,pubdate=datetime.date.today()):
## 初始化时 给到一个默认值
## 在python中 none和‘’是两个不同的数据类型
self.title = title
self.price = price
self.author = author
self.publisher = publisher
self.pubdate = pubdate
def print_info(self):
print('当前书本信息如下:')
print('标题是:{}'.format(self.title))
print('价格是:{}'.format(self.price))
print('作者是:{}'.format(self.author))
print('出版社是:{}'.format(self.publisher))
print('出版日期是:{}'.format(self.pubdate))
def __repr__(self):
return '<图书 {} at 0x{}>'.format(self.title,id(self))
## 次函数是用于打印实例book1时 显示的内容,而不是显示内存对象地址
## id表示在内存中的地址 print(book1) <图书 C# at 3061360> 0x表示16进制
def __str__(self):
return '[图书:{}, 价格:{}]'.format(self.title,self.price)
def __del__(self):
Book.count -= 1
# del是一个内置函数用于统计书本的数据量
def static_method():
# 调用的方法是 Book.static_method通过类调用,这个方法是最常用的
print('静态函数,逻辑上和实例无关')
## 如果这个方法既想通类调用又想通过实例调用的话 就用装饰器
@staticmethod
def static_method():
# 调用的方法是 Book.static_method通过类调用
print('静态函数,逻辑上和实例无关,可以通过类和实例同时调用')
## 对于数据限制可以有下面两个方法:
def cu_age(self):
return datetime.date.today().year - self.pubdate.year
## 后面调用的方法是: print(book1.cu_age()),
## book1 =Book('C#',38.00,'张 ','清华出版',datetime.date(2006,3,1))
@property # 装饰器
def age(self):
return datetime.date.today().year - self.pubdate.year
## 这个属性方法和上面是一样的,但是这个可以继续向下赋值和限制,
## 他的调用放是 print(book1.age)
@age.setter # 装饰器
def age(self,value):
raise AttributeError('禁止赋值年龄!')
@age.deleter
def age(self):
raise AttributeError('年龄不能删除')
if __name__ == '__main__':
book1 =Book('C#',38.00,'张 ','清华出版','2016-01-02')
Book.count += 1 ## 全局调用
## Book后面用()在调用时,其实就是说 调用了__init__的函数
book2 = Book('flask')
book2.author='陈 明'
Book.count += 1 ## 全局调用
book1.print_info()
book2.print_info()
print(book1)
book1.age = 20
del(book1.price)
print(book1.price)
del(book1.age)
print(book1.age)
import datetime
class Book:
count = 0 # 这个表示这个是和Book有关,不是和实例有关
def __init__(self,title,price=0.0,author='',publisher=None,pubdate=datetime.date.today()):
## 初始化时 给到一个默认值
## 在python中 none和‘’是两个不同的数据类型
self.title = title
self.price = price
self.author = author
self.publisher = publisher
self.pubdate = pubdate
Book.count += 1
def print_info(self):
print('当前书本信息如下:')
print('标题是:{}'.format(self.title))
print('价格是:{}'.format(self.price))
print('作者是:{}'.format(self.author))
print('出版社是:{}'.format(self.publisher))
print('出版日期是:{}'.format(self.pubdate))
def __repr__(self):
return '<图书 {} at 0x{}>'.format(self.title,id(self))
## 次函数是用于打印实例book1时 显示的内容,而不是显示内存对象地址
## id表示在内存中的地址 print(book1) <图书 C# at 3061360> 0x表示16进制
def __str__(self):
return '[图书:{}, 价格:{}]'.format(self.title,self.price)
def __del__(self):
Book.count -= 1
# def cls_method(cls):
# print('类是实例')
## 所以 self的就是和实例相关的, 不加参数或是cls就是和类相关的
def static_method():
# 调用的方法是 Book.static_method通过类调用,这个方法是最常用的
print('静态函数,逻辑上和实例无关')
## 如果这个方法既想通类调用又想通过实例调用的话 就用装饰器
@staticmethod
def static_method():
# 调用的方法是 Book.static_method通过类调用
print('静态函数,逻辑上和实例无关,可以通过类和实例同时调用')
## 对于数据限制可以有下面两个方法:
def cu_age(self):
return datetime.date.today().year - self.pubdate.year
## 后面调用的方法是: print(book1.cu_age()),
## book1 =Book('C#',38.00,'张 ','清华出版',datetime.date(2006,3,1))
@property # 装饰器
def age(self):
return datetime.date.today().year - self.pubdate.year
## 这个属性方法和上面是一样的,但是这个可以继续向下赋值和限制,
## 他的调用放是 print(book1.age)
@age.setter # 装饰器
def age(self,value):
raise AttributeError('禁止赋值年龄!')
@age.deleter
def age(self):
raise AttributeError('年龄不能删除')
if __name__ == '__main__':
book1 =Book('C#',38.00,'张 ','清华出版',datetime.date(2006,3,1))
## Book后面用()在调用时,其实就是说 调用了__init__的函数
book2 = Book('flask')
book2.author='陈 明'
# del book2
book1.print_info()
book2.print_info()
print(book1)
print(book1.cu_age())
print(book1.age)
book1.pubdate = datetime.date(2007,8,7)
book1.age = 20
del(book1.price)
print(book1.price)
del(book1.age)
print(book1.age)
类集成的另外例子,在参数中放入另外一个 Department 类 ,还有在集成时不用super的方法
class Department():
def __init__(self,department,phone,manager):
self.department = department
self.phone = phone
self.manager = manager
def __repr__(self): ## 目的是为在下面运行Department实例时 不会出现内存对象
return '<部门: {}>'.format(self.department)
class Employee():
def __init__(self,department:Department, name,bri):
self.department = department
self.name = name
self.bri = bri
class HR(Employee):
def __init__(self,department,name,bri,level:1):
Employee.__init__(self,department,name,bri)
self.level = level
if __name__ == '__main__':
department1 = Department('IT','021-342309','Tom')
hr1 = HR(department1,'lisi','2003,01,02',1)
print(hr1.name)
print(hr1.department)
print(department1)
print(department1.manager)
############ 关于时间函数 #####
import datetime
print(datetime.date(1992,3,2))
print(datetime.date.today().year)
print(datetime.date(1992,3,1).year)
######### 15 关于异常处理 #####
f = open('ip.txt')
try:
f.read()
except:
print('文件操作遇到错误!')
finally: # finally 目的为不管前面如何处理都要关闭操作,
# 这个是数据库是一样的,文件和连接已经打开了,遇到了异常
f.close()
def method():
raise NotImplementedError('改代码方法还未实现')
method()
######### 16 sql 的处理 ####
name = ('tom',)
sql = "select * from LinkMan where Name = ?"
c.execute(sql,name)
sql1 = 'insert into LinkMan vlaues (:name,:Mobile,:birthdate,:isvalid)'
sql2 = 'insert into LinkMan vlaues (?,?,?,?)'
# 利用占位符的两个方法 一种是:name, 一种是 ?
c.execute(sql1,{"name":"john","mobile":186345600,"brithdate":"1998-09-05","isvalid":1})
c.execute(sql2,{"john",186345600,"1998-09-05",1})
conn.commit()