1. 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()
  1. 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 两个方面
  1. 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)
  1. 关于数字替换的方法 ################################### i =0 -----> 00000 i= 10 ------> 00010 i =100 ----->00100 url = "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)
  1. 使用多线程方法启动多个爬虫任务: ########################################################
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()
  1. 学习一个爬虫中scroll down 下拉条的循环 #######################################################
for x in range(1, 11, 2):
time.sleep(0.5)
 j = x / 10
 print(x)
 print(j)
  1. 监控机器的相关运行状态,并通过函数调用循环执行: ####################################################
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=' ')

###########10 包和模块

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()