# -- coding: utf-8 --
# @Time : 2022/8/23 15:09
# @Author : siyu.yang
# @desc : 第四章 模块,包,文件,日期、时间
# python 模块
# 对于一个复杂的功能,为了编写可维护的diamond,我们把很多函数分组,分别放
# 到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种
# 组织代码的方式。
# 在python中,一个.py文件就称之为一个模块(Module)。即一个文件被看作一个
# 独立的模块,一个模块也可以看作一个文件。
# 使用模块可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同
# 模块中,因此,在编写模块时,不必考虑名字会与其它模块冲突。但是也要注意,进来不要与
# 内置函数名字冲突。
# 内置模块:系统自带的,如:sys,os,subprocess,time,json等等 使用代码查看:
# print(help('modules'))
# 自定义模块:自己个人编写的模块代码,自定义模块时注意命名,不能和python自带的模块名称
# 冲突。例如,系统自带了 sys 模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的
# sys模块
# 开源模块:公开的第三方模块,如 https://pypi.python.org/pypi。可以安装pip install
#
# 安装,类似手机app应用实参或者是maven仓库。
# 模块导入:
# python 允许”导入“其它模块以实习那代码重用,从而也实习那了将独立的二代目文件组织
# 成更大的程序
# 系统。
# 1.import 语句 [常用于导入内置模块]:
# 用于导入模块,import 放在程序的起那么,且按照python标准库模块、python第三方模块、
# 自定义顺序
# 从上到下排开。语法如下;
# import module
# 导入厚,使用 模块名.函数名 引用
# 2.from-import 语句
# 常用于只导入指定模块的部分属性或模糊导入,语法如下:
# from module import name1,[name2[...nameN]]
# 注意:
# 不推荐使用:from module import *
# 使用as 更换名称:from module import name1 as name2
# 通过这种方式引入的时候,条用函数时只能给初函数名,不能给出模块名,但是当两个个模块含有
# 相同的名称函数的时候,后面一次引入会覆盖前一次引入,有了别名之后与哪有的方法名不能在
# 使用了
# 为什么要取别名,两个方法名称从夫了
# 系统模块调用举例:
# import time
# time.sleep(3)
#
# from time import sleep
# sleep(3)
# 用户自定义模块举例:
# 新建test.py,在test.py中定义了函数add:
# def add(a,b):
# return a+b
# 在其它文件中可以先import test,然后通过test.add(a,b)来调用,当然也可以通过
# from test import add 来引入。
# 备注:在用import 引入模块时,会将引入的模块文件中的代码执行一次。且旨在第一次引入
# 时才会执行模块中的代码。
# import 语句导入指定的模块时会执行3个不揍
# 1.找到模块文件:在模块搜索路径下搜索模块文件
# 程序的主目录
# python path 目录
# 标准连接库目录
# 2.编译成字节码:文件导入时会编译,因此,顶层文件的 .pyc 字节码文件在内部使用厚会被
# 丢弃,只有被导入的文件才会留下.pyc文件
# 3.导入import (或重载reload)时,python 会立即执行模块文件的顶层程序代码(不在函数
# 内的代码),而位于函数主体内的代码知道函数被调用后才会被执行,reload() 用于重新加载模块。
# 备注:
# 1.如果不想如第三点导入导入模块的代码,常用的解决防范时:在python模块中需要测试或者直接
# 允许代码前加
# 判断自己是不是自己,当另一个模块调用执行的时候__name__的值等于包名.模块名称
# if __name__ == '__main__':
# 2.通过sys.path.append(path) 函数来导入自定义模块的所在的目录
# python 包
# 包用于将一组模块归并到一个目录中,将有联系的模块组织在一起,可以有效避免模块名称
# 冲突的问题让应用组织结构更加清晰。
# python愈发要求每个包内都必须有__init__.py问及那,__init__.py可包含python代码,单通常
# 为空,仅用于扮演包初始化、替目录产生模块命名空间以及使用目录导入时实现from * 行为的角色。
# python 在执行模块导入时可以只当模块的导入路径 import pack1.pack2.mod1
# 如 python 应用程序目录结构:
# app
# apps
# a
# __init__.py
# test.py
# b
# __init__.py
# __init__.py
#
# apps 是最顶层的包,a 和 b都是它的子包,可以这样导入
# from apps import test
# a = test.add(3,4)
# print(a)
# 查看环境的变量目录
'''
import sys
sys.path.append('C:/Users/kcadmin/Desktop/python code/PO_UI_Test_Framework')
for i in sys.path:
print(i)
'''
# python 文件操作
# python 文件操作;
# python 提供了必要的函数和方法进行进行默认情况下的文件基本操作。可以用file对象
# 做大部分的文件操作。
# open 函数
# 你必须先用python 内置的open()函数打开一个文件,创建一个file对象,先骨干的辅助方法
# 才可以调用它进行读写。
# 语法:
# file object = open(file_name[,access_mode][,buffering])
# 各个参数的细节如下:
# access_mode: access_mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下
# 的完全列表。这个参数是非强制的,默认文件访问模式为只读((r)
# buffering : 如果buffering的值被设为 0, 就不会有寄存。如果buffing 的值取1,访问文件
# 时会寄存存行。如果将 buffering 值设为大于1的整数,表明了这就是的寄存区的缓存大小。
#如果取值负值,寄存区的缓存区大小则为系统默认
# access_mode 属性值介绍:
# 对文件的操作包含 r(读) w(写) a(追加)
# r 只读方式打开文件
# rb 以二进制格式打开一个文件用于只读。
# r+ 打开一个文件用于读写
# rb+ 以二进制格式打开一个文件用于读写
# w 写的方式打开文件,表示新建或者覆盖文件,也有 wb w+ wb+ 与 r 类似
# a 追加的方式打开文件,表示再文件内容末尾添加内容,也有 ab a+ ab+
# 注: r、w 方式操作文件时,文件指针指向文件开头,a 方式时,指向文件末尾
# file 对象的属性
# file.closed 返回 ture 如果文件已经被关闭,否则返回false。
# file.mode 返回被打开文件的访问模式
# file.name 返回文件的名称
# file.encoding 返回文件编码
# 模式 r r+ w w+ a a+
# 读 + + +
# 写 + + + + +
# 创建 + + + +
# 覆盖 + +
# 指针在开始 + + + +
# 指针在结尾 + +
# 读取文件内容:
# read() 方法从一个打开的文件中读取一个字符。需要重点注意的是,python文件字符串可以是
# 二进制数据,而不仅仅是文字。
# 语法:fileObject.read([count])
# 在这里,被传递的参数要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,
#如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
# 关闭文件:
# File 对象的close() 方法刷新缓冲区里任何还没有写入的信息,并关闭该文件,这之后
# 便不能再进行写入。
# 语法 : fileObject.close()
# 往文件写入数据:
# write() 方法可将任何字符串写入一个打开的文件。需要注意重点是,python 字符串可以是
# 二进制数据,而不仅仅是文字。write() 方法不在字符串的结尾不添加换行符 ('\n');
# flush() 方法刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件
# 语法:
# fileObject.write(string)
# fileObject.flush()
# 其它操作文件方法:
# fp.readline([size]) # 读一行,如果定义了size,有坑你返回的只是一行的一部分
# fp.readlines([size]) # 把文件每一行作为一个list的一个成员。其实它的内部使通过
# 循环调用,如果提供size 参数,size 是表示读取内容的总长,
# 也就是说坑你值读到文件的一部分。
# fp.writelines(eq) # 把seq的内容全部写道文件中(多行一次性写入)。如果血药换行则要自
# 己加入每行的换行符
# fp.next() # 返回下一行,并将文件操作标记位移到下一行。如果需要换行则要自己加入
# 每行的换行符
# 举例:
# 读入内容 read() read(n) readline()
# 1.read 方法无参数
'''
txt1 = open('C:/Users/kcadmin/Desktop/hello.txt','r',encoding='utf-8')
str1= txt1.read()
print(str1)
txt1.close()
'''
# 2.read 方法有参数,表示读取的字符数
'''
a = open('C:\\Users\\kcadmin\\Desktop\\python code\\PO_UI_Test_Framework
\\sample\\test_02\\
demo_04.py',encoding='utf-8')
str1 = a.read(3)
str2 = a.read(3) # 在同一个io流,如果有多个read会接着从上一次的位置开始读取
print(str1)
print(str2)
'''
# 3.readline() 读取行
'''
txt1 = open('C:/Users/kcadmin/Desktop/hello.txt','r',encoding='utf-8')
# 无参数的时候默认只读一行
str1= txt1.readline()
# 有参数的时候,就是读取的字符数,大于一行,也只返回一行的内容
str2= txt1.readline(33)
# 无参数的时候,读取整个文件的内容,结果是一个列表,每一行时列表的一个元素
str3= txt1.readlines()
# 有参数的时候,不满一行也会读取一行,超过一行的字符串才会读取下一行
str4= txt1.readlines(3)
print(str1)
print(str2)
print(str3)
print(str4)
txt1.close()
'''
# 4.写文件
'''
file = open('C:/Users/kcadmin/Desktop/hello.txt','w',encoding='utf-8')
print(file.write('3333333333'))
file.flush() # 从缓冲区保存到硬盘,只要文件内容发生了改变就必须flush()提交
file.close() # 关闭文件,不关闭文件会造成文件损坏或文件丢失
'''
# 5.常见属性
'''
txt1 = open('C:/Users/kcadmin/Desktop/hello.txt','a',encoding='utf-8')
print('文件名:',txt1.name)
print('编码:',txt1.encoding)
print('文件权限:',txt1.mode)
print('是否关闭:',txt1.closed)
txt1.close()
print('是否关闭:',txt1.closed)
'''
# 练习:创建一个文件123.txt 文件内容为“我爱学习”
# 创建一个abc.txt 文件内容为“我享受生活”
# 再将两个文件的内容进行交互
'''
txt1 = open('C:/Users/kcadmin/Desktop/123.txt','w')
txt2 = open('C:/Users/kcadmin/Desktop/abc.txt','w')
content1 = '我爱学习'
content2 = '我享受生活'
txt1.write(content1)
txt2.write(content2)
txt1.flush()
txt2.flush()
txt1.close()
txt2.close()
txt3 = open('C:/Users/kcadmin/Desktop/123.txt','r')
txt4= open('C:/Users/kcadmin/Desktop/abc.txt','r')
str1 = txt3.read()
str2 = txt4.read()
txt3.close()
txt4.close()
txt3 = open('C:/Users/kcadmin/Desktop/123.txt','w')
txt4= open('C:/Users/kcadmin/Desktop/abc.txt','w')
txt3.write(str2)
txt4.write(str1)
txt3.flush()
txt4.flush()
txt3.close()
txt4.close()
'''
# 文件位置:
# tell() 方法告诉你文件内的当前位置,换句话说,下一次的的读写会发生在文件开头这么多字
节之后。
# seek(offset[from]) 方法改变当前文件的位置。offset 变量表示要移动的字节数。from 变量
# 指定开始移动字节的参考位置。如果from 被设为0,这意味着将b文件的开头作为移动字节的
#参考位置。如果 设为1,则使用当前的位置作为参考位置。如果它设为2,那么该文件的末尾将
# 作为参考位置。如果没有使用b模式(二进制)打开文件,那么只能从文件起始位置产生位移
'''
txt5 = open('C:/Users/kcadmin/Desktop/123.txt','rb') # 以二进制方式不能指定编码
str = txt5.read(5)
print(str)
print(txt5.tell())
# seek(数量,位置) 0 -- 起始位置,1 -- 当前位置 ,2 -- 文件末尾
print(txt5.seek(6,1))
str2 = txt5.read(5)
print(str2)
txt5.close()
'''
# 重命名和删除文件
# python 的 os 模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。
# 要使用这个模块,你必须先导入它,然后可以调用相关的各种功能。
# rename() 方法:
# rename() 方法需要两个参数,当前的文件名和新文件名。
# 语法:
# os.rename(current_file,new_file_name)
# remove()方法:
# 你可以用remove() 方法删除文件,需要提供要删除的文件名作为参数
# 语法:
'''
import os
# os.rename('C:/Users/kcadmin/Desktop/123.txt', 'C:/Users/kcadmin/Desktop/aaa.txt')
os.remove('C:\\Users\\kcadmin\\Desktop\\aaa.txt')
'''
# 目录操作:
# mkdir()方法: 可以使用os模块的mkdir()方法当前目录下创建新的目录
# 语法: os.mkdir(file_name)
# chdir()方法: 可以用chdir() 方法来改变当前的目录。
# 语法: os.chdir(filename)
# makedirs()方法:创建多级目录:
# 语法:os.makedirs('c:\python\test')
# getcwd() 方法: 得到当前工作目录
# 语法: os.getcwd()
# isdir()/isfile()方法:检验给出的路径是否是一个目录/文件
# os.path.isdir("c:/book/temp")
# 日期、时间操作
# 在进行编程活动中,经常会用到日期和时间,python有相应的模块处理日期和时间,
#在介绍python处理日期和时间的方式之前,先理解时间戳概念:
# 时间戳是指格林威时间1970年01月00时00分00秒(北京时间1970年01月00时00分00秒)起到
# 现在的总秒数。通俗的讲,时间戳时一份能够表示一份数据在一个特定时间点已经存在的完整
# 的可验证的数据
# 在python 中常用time和datetime来处理时间【注意导包】
# time 模块一般常用4种方式显示时间:
# 1.时间元组,即用一个元组组装起来的9组数字处理时间
'''
# (年、月、日、是、分、秒、一周的低级日、一年的低级日、夏令时)
t = (2022, 8, 26, 14, 50, 0, 0, 0,0)
print(t)
'''
# 2.时间戳
'''
import time
print(time.time()) # 当前时间戳
'''
# time.mktime(t) # 给订时间的时间戳
'''
import time
t1 = (2022,8,26,14,50,0,0,0,0)
print(time.mktime(t1))
'''
# time.localtime(时间戳) # 转换时间戳为元组
'''
import time
print(time.localtime(1661496600.0))
'''
# 3.格式化显示 (即字符串、时间元组相互转换)
# time.strfime("%Y_%m_%d %H:%M:%S:%p",t) #不加时间元组显示当前时间
# time.strptime(str,'%Y-%m-%d %X')
'''
import time
t = 1661496600
# 价将时间t按照固定的格式显示
print(time.strftime("%Y_%m_%d %H:%M:%p",time.gmtime(t)))
# 将字符串时间按照指定时间显示
print(time.strptime('2022-8-26 14:50:00','%Y-%m-%d %H:%M:%S'))
print(time.time())
print(time.localtime(time.time()))
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
print(time.strptime('2022-08-29 15:55:40','%Y-%m-%d %H:%M:%S'))
'''
# 4.英文显示 'Mon Jan 26 00:52:24 1970'
'''
import time
t = (2022,8,29,15,55,40,0,0,0)
print(time.asctime(t))
'''
# datetime模块
# 模块下有几个子模块:
# date:处理年月日
# time:处理时分秒、微妙
# datetime:处理年月日,时分秒,微妙
# 1.时间元组表示:
# dt = datetime.datetime(2022,08,26,15,02,45,0) # (年、月、日、时、分、秒、微妙)
'''
import datetime
dt = datetime.datetime(2022,8,26,15,2,45,0)
print(dt)
'''
# 2.截取时间元组种的部分:
# dt.year dt.month dt.date() dt.time() dt.weekday() dt.isoweekday()
'''
import datetime
dt = datetime.datetime(2022,8,26,15,2,45,0)
print('年:',dt.year)
print('月:',dt.month)
print('日期:',dt.date())
print('时间:',dt.time())
print('星期:',dt.weekday())
print('星期几:',dt.isoweekday()) # 返回0-6
'''
# 3.获取当前时间
# datetime.datetime.today() datetime.datetime.now()
'''
import datetime
print('获取当前时间:',datetime.datetime.today())
print('获取当前时间:',datetime.datetime.now())
'''
# 4.获取时间戳
# dt.timestamp() dt.fromtimestamp()
'''
import datetime
dt = datetime.datetime(2022,8,26,15,2,45,0)
# 将时间转换成时间戳
print('将时间转换成时间戳:',dt.timestamp())
# 将时间戳转换成字符串
print('将时间戳转换成字符串:',dt.fromtimestamp(dt.timestamp()))
'''
# 5.按自定义格式返回字符串
# dt.strftime('%Y_%M_%D %H:%M:%s')
'''
import datetime
print(datetime.datetime.strptime('2020-01-01 0:0:0', '%Y-%m-%d %H:%M:%S'))
'''
# 6.英文显示
# dt.ctime()
'''
import datetime
dt = datetime.datetime(2022,8,26,15,2,45,0)
print(dt.ctime())
'''