#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:Source
import shutil
#shutil模块
# f = open('test','w')
# f.write("测试文本")
# f.closed
# f1 = open('test','r')
# f2 = open('copyfileobj_test','w')
# shutil.copyfileobj(f1,f2)#将文件内容拷贝高另一个文件中,可以部分内容,文件事先要存在。
# shutil.copyfile('test','copyfile_test')#拷贝文件
# shutil.copymode('test','copymode_test')#仅仅拷贝权限。内容、组、用户均不变化,文件事先要存在。
# shutil.copystat('test','copystat_test')#拷贝状态信息,包括mode bits,atime,mtim# e,flags
# shutil.copy('test','copy_test')#拷贝文件和权限
# shutil.copy2('test','copy2_test')#拷贝文件和状态信息
# shutil.copytree("C:/Users/ys106/PycharmProjects/Source/day4/homework/ATM_Program",'C:/Users/ys106/PycharmProjects/Source/day5/homework/copytree_test')#递归的去拷贝文件
# shutil.rmtree('copytree_test')#递归的去删除文件
#shutil.move('C:/Users/ys106/PycharmProjects/Source/day5/homework/copytree_test','C:/Users/ys106/PycharmProjects/Source/day4/homework/move_test')
#shutil.make_archive("backups/ATM/make_archive_test","zip",'C:/Users/ys106/PycharmProjects/Source/day4/homework/ATM_Program')#创建压缩包并返回文件路径
#shutil.make_archive实际上是调用了ZipFile和TarFile两个模块来进行的
#压缩
# z = zipfile.ZipFile("Zipfile_test.zip","w")
# z.write('test')
# print("可以中断一下")
# z.write("copy_test")
# z.close()
#解压
# z= zipfile.ZipFile('Zipfile_test.zip','r')
# z.extractall('C:/Users/ys106/PycharmProjects/Source/day5/homework/zipfile')#可以指定目录
# z.close()
# shutil.rmtree("C:/Users/ys106/PycharmProjects/Source/day5/homework/zipfile")
# homeword_ATM = zipfile.ZipFile('backups/ATM/make_archive_test.zip','r')
# homeword_ATM.extractall("C:/Users/ys106/PycharmProjects/Source/day5/homework/backups/ATM")
# #shutil.rmtree("C:/Users/ys106/PycharmProjects/Source/day5/homework/backups/ATM/Users")
# homeword_ATM.close()
#压缩
'''tar = tarfile.open('tarfile.tar','w')
tar.add('test',arcname = 'tarfile_test.zip')
tar.close()#不知道为什么生成不了压缩文件
#解压
tar = tarfile.open("tarfile.tar",'r')
tar.extractall("C:/Users/ys106/PycharmProjects/Source/day5/homework/backups")
tar.close()'''#存在bug,压缩文件打不开
#常用模块的学习,模块的定义是:本质上是一个以.py结尾的python文件(文件名:test.py 模块名:test)。
#包定义:是用来逻辑组织模块,本质上是一个文件夹(必须带一个_init_.py文件)
#模块的作用:是用来逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能)
# 导入方法:import module_name
# import module_name,module2_name
# form module_alex import*
# from module_alex import m1,m2,m3
# from module_alex import logger as logger_alex
import os
import sys
to_lead_other_addr = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#print(to_lead_other_addr)
sys.path.append(to_lead_other_addr)
import areyourready
#相对导入 form.import test1的使用?导入包与__init__同一级目录
#import本质:
#先将模块内的所有文件解释一遍并赋值给一个变量,导入时候要加上变量名再加点进行调用
#from import本质:
#打开文件,找到变量,变量拿到当前位置执行一遍
#导入包的本质:
#执行包下的__init.py__文件
#导入优化:
import time
# print(time.time())#用秒进行时间的表示
# print(time.timezone)#本地时间与UTC世界标准时间的差值
# print(time.ctime(time.time()))#格式化显示时间,传入的是时间戳
# print(time.daylight)#判断是否使用夏时制,否为0
# #print(time.sleep(1))#起延时作用
# print(time.gmtime(time.time()))#传入的是时间戳
# print(time.gmtime())#不传数据,显示UTC标准时间
# print(time.localtime())#显示当地时区时间,中国UTC+8,传值按秒的形式
# x = time.localtime()
# print(x.tm_mday)#取出个别,gmtime()也类似
# print(time.mktime(time.localtime()))#将元组形式的时间转化为秒的形式
# print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))#传入的元组的是元组的形式
# print(time.strptime("2018-10-29 16:17:29","%Y-%m-%d %H:%M:%S"))
# t = (2018,10,29,17,6,28,0,302,0)
# print(time.asctime(t))#传入的是元组
# print(time.asctime())
import datetime
# print(datetime.datetime.now())#获取当前时间
# print(datetime.datetime.now()+datetime.timedelta(3))#当前时间+3
# print(datetime.datetime.now()+datetime.timedelta(-3))#当前时间-3
# print(datetime.datetime.now()+datetime.timedelta(hours = 2))#当前时间+2小时
# print(datetime.datetime.now()+datetime.timedelta(minutes = -10))#当前使间-10分钟
# c_time = datetime.datetime.now()
# print(c_time.replace(hour=8,minute=10))#更改时间
import random
print(random.random())#随机的0-1的浮点数
print(random.randint(0,50))#随机指定的整数
print(random.randrange(0,50,2))#随机选取0-50的奇数
tuple = (1,6,7,9)
print(random.choice(tuple))#随机取一个值,可以传入元组、字符串、列表等
print(random.sample("source",2))#前面定义序列,后面定义取的位数
print(random.uniform(1,10))#指定随机取的范围
items = [2,4,8,6,15,10]
random.shuffle(items)#洗牌,打乱顺序
print(items)
print(os.getcwd())#获取当前工作目录
#print(os.chdir())#改变当前脚本的工作目录,可以采用两个斜杆或者在路径前加一个'r'的方式
print(os.curdir)#返回当前目录.
print(os.pardir)#返回上一级目录..
os.makedirs(r"C:\Users\ys106\PycharmProjects\Source\day5\homework\os_test\hello")#递归地去创建一个目录,即使不存在。
#shutil.rmtree("C:\\Users\\ys106\\PycharmProjects\\Source\\day5\\homework\\os_test")
os.removedirs("C:\\Users\\ys106\\PycharmProjects\\Source\\day5\\homework\\os_test\\hello")#若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,以此类推
#os.mkdir(),生成单级目录;相当于shell中mkdir dirname
#os.mkdir('mkdir_test/test')
#os.rmdir(),删除单级空目录,若目录不为空则无法删除,报错;相当于shell中的 rmdir dirname
#os.rmdir('mkdir_test/test')
#os.listdir(),列除指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印。
print(os.listdir('test_from_point_import'))
#os.remove() 删除一个文件
#os.remove('mkdir_test/remove_test')#似乎必须是文件
#os.rename() 重命名文件/目录
#os.rename('mkdir_test','new_name')
#os.stat() 获取文件/目录信息
print(os.stat('test_from_point_import'))
#os.sep,输出操作系统特定的路径分隔符,win下为"\\",linux下为“/”
print(os.sep)
#os.linesep,输出当前平台使用的行终止符,win下为“\t\n”,Linux下为“\n”
print(os.linesep)
#os.name,输出字符串指示当前使用平台。win->"nt";Linux->"posix"
print(os.name)
#os.system(),运行shell命令,直接显示
print(os.system('dir'))
#os.environ,获取系统环境变量
print(os.environ)
#os.path.abspath(path),返回path规范化的绝对路径
print(os.path.abspath(__file__))
#os.path.split(path),将path分割成目录和文件名二元组返回
print(os.path.split('test_from_point_import'))
#os.path.basename(path),返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。
print(os.path.basename(os.path.abspath(__file__)))
#os.path.dirname(path),返回path的目录。其实就是os.path.split(path)的第一个元素
print(os.path.dirname(os.path.abspath(__file__)))
#os.path.exists(path),如果path存在,返回True;如果path不存在,返回False
print(os.path.exists(os.path.dirname(os.path.abspath(__file__))))
#os.path.isabs(path),如果path是绝对路径,返回True
print(os.path.isabs("C:\\Users\\ys106\\PycharmProjects\\"))
#os.path.isdir(path),如果path是一个存在的目录,则返回True.否则,返回False。
print(os.path.isdir("C:\\Users\\ys106\\PycharmProjects\\a"))
#os.path.isfile(path),如果path是一个存在的文件,返回True。否则返回False。
print(os.path.isfile("test_from_point_import\\test_point.py"))#后缀也必须要加上
#os.path.join(),将多个路径组合后返回,会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃.在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的上一个参数开始拼接。
print(os.path.join('/json','\\dir','python','join_test.text'))
#os.path.getatime(path),返回path所指向的文件或者目录的最后存取时间
test_getatime = os.path.getatime("test_from_point_import\\test_point.py")
print(test_getatime)
print(time.ctime(test_getatime))
#os.path.getmtime(path),返回path所指向的文件或者目录的最后修改时间
test_getmtime = os.path.getmtime("test_from_point_import/test_point.py")
print(test_getmtime)
print(time.ctime(test_getmtime))
import sys
#a = sys.argv[0:]#sys.argv 命令行参数list,第一个元素是程序本身路径
#print(a)
#sys.exit(0)#sys.exit(n) 退出程序,正常退出时exit(0)
print(sys.version)#显示Python解释程序的版本信息
print(sys.path)#sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
print(sys.platform)#返回操作系统平台名称
# sys.stdout.write("please:")#这个方法调用的是 ,file 对象中的write方法 ,把字符写到标准输出中,看起来跟print 差不多。
# val = sys.stdin.readline()[:-1]#取不到空格
# for i in range(3):
# print("hello",' ',val[i])
import shelve#shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
d = shelve.open("shelve_new_test")
print(d.get("name"))
print(d.get("age"))
print(d.get("job"))
print(d.get("info"))
print(d.get("date"))
# name =["source",'liming']
# age = ['23']
# info = {'stature':168,'addr':'sunshine'}
# d['name'] = name
# d['age'] = age
# d['info'] = info
# job = ['free man']
# d['work'] = job
# d['date'] = datetime.datetime.now()
# d.close()
import xml#实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json更简单。不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml,至今很多传统公司如金融行业的很多系统接口还是xml
import xml.etree.ElementTree as ET
tree = ET.parse('xmltest')
root = tree.getroot()
# print(root.tag)#只显示标签
#遍历xml文档
for child in root:
print(child.tag,child.attrib)
for i in child:
print(i.tag,i.text,i.attrib)
#只遍历year节点
for node in root.iter("year"):#iter的功能
print(node.tag,node.text)
#修改
# for node in root.iter("year"):
# new_year = int(node.text)+1
# node.text = str(new_year)
# node.set("updated",'yes')
# tree.write('xmltest')
#删除
for node in root.findall("country"):
rank = int(node.find('rank').text)
if rank >7:
#print("\033[31;1m888\033[0m",node)
root.remove(node)#这里有一个小问题,是否可以删除符合指定条件的country下的year
tree.write('xmltest')
#创建xml文档
# new_xml = ET.Element("newlist")
# name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
# age = ET.SubElement(name,"age",attrib={"checked":"no"})
# sex = ET.SubElement(name,'sex')
# sex.text = 'male'
# name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
# age = ET.SubElement(name2,"age",attrib={"checked":"no"})
# age.text = "23"
# name.text = "Source"
# et = ET.ElementTree(new_xml)#生成文档对象
# et.write("new_xml.xml",encoding='utf-8',xml_declaration=True)
# ET.dump(new_xml)#打印生成的格式
import configparser
#使用python生成configparser文件
# config = configparser.ConfigParser()
# config["DEFAULT"] = {
# 'ServerAliveInterval':'45',
# 'Compression':'yes',#压缩
# 'CompressionLevel':'9'
# }
# config["bitbucket.org"] = {}
# config["bitbucket.org"]["User"] ='hg'
# config["topsecret.server.com"] = {}
# topsecret = config["topsecret.server.com"]
# topsecret["Host Port"] = '50022'
# topsecret["ForwardX11"] = "no"
# config["DEFAULT"]["ForwardX11"] = 'yes'
# with open("example.ini",'w')as configfile:
# config.write(configfile)
#读configparser文件
# config = configparser.ConfigParser()
# print(config.sections())
# print(config.read('example.ini'))
# print(config.sections())
# print("DEFAULT"in config)
# print(config["DEFAULT"]['forwardx11'])
# topsecret = config["topsecret.server.com"]
# print(topsecret['ForwardX11'])
# print(topsecret["host port"])
# for key in config['bitbucket.org']:
# print(key)#打印出到的为什么是这些东西啊?
# #print(config["bitbucket.org"])
# debug_DEFAULT = config['DEFAULT']
# for key in debug_DEFAULT:
# print(key,debug_DEFAULT[key])#遍历显示default内容
#configparser增删改查语法
config = configparser.ConfigParser()
config.read('example.ini')
# #############读##############
# secs = config.sections()#eturn a list of section names, excluding [DEFAULT]
# print(secs)
# options = config.options('topsecret.server.com')
# print(options)#可以显示topsecret.server.com下的标题
# item_list = config.items('topsecret.server.com')
# print(item_list)#显示topsecret.server.com下的具体内容
# val = config.get('topsecret.server.com','compression')
# print(val)#可以的到具体的数据
# val2 =config.getint('topsecret.server.com','host port')#只能是整型。
# print(val2)#可以得到具体的整型数据
# #############改写##############
# sec = config.remove_section("topsecret.server.com")#删除了topsecret.server.com
# config.write(open('example.ini','w'))
# sec = config.has_section("source")#确定指定的部分是否存在
# print(sec)
# sec = config.add_section("source")#添加指定的内容
# config.write(open('example.ini','w'))
# config.set('source','age','23')
# config.write(open("example.ini",'w'))
# config.remove_option("source",'age')
# config.write(open('example.ini','w'))
import hashlib
#hashlib作用:用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA384,SHA512,MD5算法
m = hashlib.md5()
m.update(b'Hello')
m.update(b"It's me")
print(m.digest())#Return the digest value as a string of binary data.
m.update(b"It's been a long time since last time we...")
print(m.digest())#2进制格式hash
print(len(m.hexdigest()))#16进制格式hash
# ########MD5########
hash = hashlib.md5()
hash.update(b"administrator")
print(hash.digest())#2进制格式hash
print(hash.hexdigest())#16进制格式hash
# ######### sha512 ##########
hash_sha512 = hashlib.sha512()
hash_sha512.update("吾名大祐哥".encode(encoding='utf-8 '))
print(hash_sha512.hexdigest())
import hmac
#简介:一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接受方用key+消息明问再加密,
#拿加密后的值跟发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
hmac_test = hmac.new("天王盖地虎".encode("utf-8"),"宝塔镇河妖".encode("utf-8"))
print(hmac_test.hexdigest())
import re
print(re.match("^guo","guojiayouhaha"))#匹配字符开头,若指定flags MUTILINE,这种也可以匹配上(r"^a","\nabc\nee",flags = re.MULTILINE)
print(re.match("g..j.a","guojiayouhaha"))#'.',默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
print(re.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group())#'$',匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags = re.MUTILINE).group()也可以
print(re.findall("ab*","cabb3abcbbac"))#'*',匹配*号前的字符0次或多次
print(re.findall("ab+","ab+cd+abb+bba"))#'+',匹配前一个字符1次或多次
print(re.findall('ab?',"abbabdaabbsbab") )#'?',匹配前一个字符1次或0次
print(re.findall("ab{1,2}","ab23abbfgabbb"))#'{n,m},匹配前一个字符n到m次'
print(re.search("abc|ABC","abcdaffafaABC").group())#'|',匹配|左或|右的字符#search可能是检测到一个符合的数据就停止执行了。
print(re.search("(abc){2}a(123|456)c","abcabca456c").group())#分组匹配
print(re.search("\Ahah","Goodhah"))#只从字符开头匹配
print(re.search("hah\Z","Goodhah").group())#匹配字符结尾#还不是很肯定用法
print(re.search("1\d3",'ily123haha').group())#'\d'匹配数字0-9
print(re.search("1\D3",'ily1n3haha0').group())#"\D"匹配非数字
print(re.search("i\wy5\w0","ily520").group())#"\w"匹配[A-Za-z0-9]
print(re.search("i\Wy5\W0","i%y5$0").group())#匹配非[A-Za-z0-9]
print(re.search("\s+","ab\t\rhaha").group())#匹配空白字符,\t,\n,\r
#匹配语法
# re.match()#从头开始匹配
# re.search()#匹配包含
# re.findall()#把所有匹配到的字符放到列表中的元素返回
# re.splitall()#以匹配到的字符当作列表分隔符#似乎在python3里不存在splitall()
# re.sub()#匹配字符并替换
#for example:
print(re.split("n",'i certitude n you love me.'))
print(re.sub("n",'^',"i certitude n you love me "))
#反斜杠的困扰
#与大多数的编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠的困扰。加入你需要匹配文本中的字符"\",那么使用编程
#语言表示的正则表达式里需要4个反斜杠"\\\\",前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里
#转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"
#可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
print(re.search("\\\\4","fuck\\4hah"))#不晓得为什么不行
#re.I(re.IGNORECASE)#忽略大小写(括号内的是完整写法,下同)
#M(MULTILINE)#多行模式,改变"^"和"$"的行为
#S(DOTALL):点任意匹配模式,改变"."的行为
print(re.search("TEST","test",re.I))#re.I忽略大小写
print(re.sub(r"^a",'_',"\nabc\naee",flags = re.MULTILINE))#'^'与"$"默认匹配整个字符串的开头和结尾re.MULTILINE可以改变它的行为,换行之后依旧可以进行匹配
print(re.search('.ha','any\rhaha\n',flags=re.S))#改变点匹配模式,\r\t\n也可以匹配的到。