python 文件操作 和 标准库
python 文件操作
- 一. 文件作用
- 二. 文件读写操作
- 文件操作流程
- 1. 读取文件数据
- ⑴ 打开文件
- ⑵ 读取文件内容
- ⑶关闭文件
- 2. 写入或追加写入数据
- ⑴ 打开文件
- ⑵ 写入文件内容
- ⑶关闭文件
- 其他打开方式扩展
- 三. 使用上下文打开文件
- 四. OS模块(操作系统)常用命令
- 五. sys模块 常用命令
- 六. random模块(随机数)常用命令
- datatime
- 数据加密
- docker 应用容器框架
- 镜像操作
- 容器操作
- Git
- 远程仓库操作
- APScheduler定时器
一. 文件作用
用于永久储存数据,让程序下次执行时直接使用
二. 文件读写操作
文件操作流程
- 选择 操作模式打开文件
- 对文件进行读写操作
- 关闭文件
1. 读取文件数据
以只读形式打开文件分为两种操作模式分别是字符串“r”
和二进制(字节)“rb”
⑴ 打开文件
① “r” 以字符串的方式读取文件中的数据
格式为: 变量名 = open(“打开文件的路径及文件名”, “r”, encoding="utf-8")
- 若不指定路径仅有文件名, 表示操作当前目录中的文件
- 若指定的文件不存在, 会报错
"r"
为默认打开文件操作模式, 即若不指定操作模式就会以"r"
模式打开- 以该操作模式打开文件, 则仅能对全字符串文件做读取数据处理,若出现非字符串数据( 图片、视频、音乐)会报错。
- 由于
Windows
系统 的python解释器
默认使用GBK
编码格式打开文件(不认识中文),因此需要指定编码格式为UTF-8
。但是mac
和linux
的python解释器
默认使用UTF-8
②"rb" 以字节(二进制)的方式读取文件中的数据
格式为: 变量名 = open(“打开文件的路径及文件名”, “rb”)
- 若不指定路径仅有文件名, 表示操作当前目录中的文件
- 若指定的文件不存在, 会报错
- 以该操作模式打开文件,可以对所有格式文件(包括图片、视频、音乐)进行读取数据处理操作,但是在显示时只会显示进制数字,不会显示为字符串、图片、视频等。
⑵ 读取文件内容
格式为: 变量名.read(读取数据个数)
- 若不指定
读取数据个数
则会一次性将文件数据全部读取出来 - 若
读取数据个数
指定为100
, 则表示最多读取文件中的100个字符(“r”)或字节(“rb”)
- 在
“r”
模式中空格
、中文
和换行
皆算一个字符 - 在
“rb”
模式中空格
算一个字节中文
和换行
皆算三个字节, 并且在取中文的三个字节时若三个字节没取完整,读时会报错
格式为: 变量名.readline()
- 默认表示读取一行内容
- 若添加数字参数, 则表示读取参数所有字符(“r”)或字节(“rb”)所在行(如参数为100, 并且这100个字符(“r”)或字节(“rb”)占4行, 那么就会显示4行内容), 返回为一个列表其中包含多个字符串(一行内容为一个字符串), 换行使用
\n
表示 放在字符串末尾
格式为: 变量名.readlines()
- 默认表示读取所有内容, 返回为一个列表其中包含多个字符串(一行内容为一个字符串), 换行使用
\n
表示 放在字符串末尾
注意:
- 建议使用
“rb”
操作模式读取数据,因为其可以读取所有类型数据,若要显示字符串数据,则需要对读取到的数据进行 解码(将二进制转成字符串) 格式如下:读取到的二进制数据.decode("utf-8")
- 在打开文件到关闭文件之间进行多个读取操作时, 其光标仅在第一次读取操作时从头开始,之后的读取操作光标的开始位置就是上个读取操作的光标结束位置
files = open("2.txt", "r", encoding="utf-8")
print(files.read(7))
print("-"*50)
print(files.readline())
print("-"*50)
print(files.readlines())
files.close()执行结果为:|'abcd\n e'|--------------------------------------------------|'fg\n'|--------------------------------------------------|['hijk\n', ' lmn\n', ' opq\n', ' rst\n', ' uvw\n', ' xyz哈']
files = open("2.txt", "rb")
print(files.read(7).decode("utf8"), end="")
print("-"*50)
print(files.readline().decode("utf8"), end="")
print("-"*50)
print(files.readlines())
files.close()执行结果为:|abcd| --------------------------------------------------|efg|--------------------------------------------------|[b'hijk\r\n', b' lmn\r\n', b' opq\r\n', b' rst\r\n', b' uvw\r\n', b' xyz\xe5\x93\x88']
⑶关闭文件
格式为: 变量名.close()
关闭文件减少处理器的压力
2. 写入或追加写入数据
写入数据分为两种操作模式分别是字符串“w”
和二进制(字节)“wb”
追加写入数据也分为两种操作模式分别是字符串“a”
和二进制(字节)“ab”
注意:
- 以
“w”或“wb”
模式打开文件,会将文件内的数据删除(仅在打开文件时),若多次进行写入操作, 会依次追加到空白文件中 - 以
“a”或“ab”
模式打开文件,不会将文件内的数据删除, 而是将数据追加到文件中,若多次进行写入操作, 会依次追加到文件末尾
⑴ 打开文件
① “w"或"a” 以字符串的方式将数据写入或追加写入文件中
格式为: 变量名 = open(“打开文件的路径及文件名”, “w”/"a", encoding="utf-8")
- 若不指定路径仅有文件名, 表示操作当前目录中的文件
- 若指定的文件不存在, 不会报错,会新建一个新文件(文件名为指定文件名)
- 以该操作模式打开文件, 则仅能向文件中写入或追加写入字符串数据
- 由于
Windows
系统 的python解释器
默认使用GBK
编码格式打开文件(不认识中文),因此需要指定编码格式为UTF-8
。但是mac
和linux
的python解释器
默认使用UTF-8
②"wb"或"ab" 以字节(二进制)的方式将数据写入或追加写入文件中
格式为: 变量名 = open(“打开文件的路径及文件名”, “wb”/"ab")
- 若不指定路径仅有文件名, 表示操作当前目录中的文件
- 若指定的文件不存在, 不会报错,会新建一个新文件(文件名为指定文件名)
- 以该操作模式打开文件,需要对字符串数据进行编码才能写入或追加写入数据
⑵ 写入文件内容
格式为: 变量名.write(写入的数据)
- 若以
“w”
或"a"
操作模式打开,则只能将字符串数据写入或追加写入 - 若以
“wb”
或“ab”
操作模式打开,仅能将进制(字节)数据写入或追加写入,若要写入字符串数据, 则需要将字符串数据编码成二进制数据才能写入格式如下:要写入的字符串数据.encode("utf-8")
file = open("3.txt", "w", encoding="utf-8")
file.write("xx")
file.write("哈哈")
file.close()3.txt的内容:|xx|哈哈
file = open("3.txt", "ab")
content = "嘿嘿"
data = content.encode("utf-8")
file.write(data)
file.close()3.txt的内容:|xx|哈哈|嘿嘿
⑶关闭文件
格式为: 变量名.close()
关闭文件减少处理器的压力
完成大文件的拷贝
# 1. 打开目标文件(拷贝后的文件)
dst_file = open(dst_file_name, "wb")
# 2. 读取原文件的数据
src_file = open(src_file_name, "rb")
# 读取文件中的所有数据,把数据加载到内存,可能导致内存暴涨,内存溢出等情况
# src_file_data = src_file.read()
# 解决办法:每次读取一小部分数据,多次进行读取即可
while True:src_file_data = src_file.read(1024) # 1024: 每次读取的最大字节数if src_file_data: # 判断字节类型里面是否有数据# 3. 把读取到的原文件数据写入到目标文件dst_file.write(src_file_data)else:print("文件拷贝成功,数据读取完成!", src_file_data, len(src_file_data))break
# 关闭文件
src_file.close()
dst_file.close()
其他打开方式扩展
r+, w+,a+, rb+, wb+, ab+ ,这里的加号表示可读可写
三. 使用上下文打开文件
格式: with open(“打开文件的路径及文件名”, “操作模式”) as 临时变量:
- 关闭文件不需要程序员来完成, 是由解释器帮我们来完成
- 即使读写文件时出现了异常,那么关闭文件操作依然能够完成
- with open操作文件又简单又安全
# 4G 内存读取一个 5G 的数据?
# 方法一:可以通过生成器,分多次读取少量数据(比如 500MB)进行处理,处理结束后,再读取后续数据。
def get_lines():l = []with open(‘file.txt’,’rb’) as f:data = f.readlines(60000)l.append(data)yield lif __name__ == ‘__main__’:for e in get_lines():process(e) # 处理每一行数据
四. OS模块(操作系统)常用命令
作用: 对文件或文件夹进行新建 重命名 查看路径 切换路径删除等操作
首先需要导入os模块import os
命令 | 描述 |
---|---|
os.mkdir("文件夹名")
|
创建文件夹(不能创建文件) |
os.rename("原名", "新名")
|
对文件或文件夹进行重命名 |
os.remove("文件名")
|
只可删除文件 |
os.rmdir("文件夹名")
|
只能删除空文件夹 |
os.getcwd()
|
查看当前路径, 返回一个字符串 |
os.chdir("目标路径")
|
切换当前路径为目标路径(包括绝对路径和相对路径) |
os.chmod()
|
改变目录权限 |
os.listdir("目标路径")
|
获取目标路径下的所有文件和文件夹名, 返回为包含多个记录文件或文件夹名的字符串列表 |
os.path.getatime\ctime\mtime()
|
分别返回最近访问、创建、修改时间 |
os.path.getsize("文件或文件夹")
|
返回文件或文件夹大小 |
os.path.exists("文件或文件夹")
|
判断目标文件或文件夹是否存在于指定目录, 返回Ture或False |
os.path.isfile("文件名")
|
判断目标路径下的目标文件是否是文件, 返回Ture或False, 包括文件不存在 |
os.path.isdir("目标路径")
|
判断目标路径是否是文件夹, 返回Ture或False, 文件夹不存在为False |
os.path.isabs("目标路径")
|
判断目标路径是否是绝对路径 |
os.path.basename("路径和文件名")
|
根据指定路径和文件名,获取文件名, 并返回一个字符串 |
os.path.dirname("路径和文件名")
|
根据指定路径和文件名,获取路径, 并返回一个字符串 |
os.path.join("指定路径", "文件名")
|
将分离的各部分组合成一个路径名 |
os.path.split("路径和文件名")
|
返回(文件路径, 文件名) 元组
|
os.path.splitext("指定文件名")
|
根据指定文件名,获取文件名和后缀, 返回元组, 包含文件名和后缀(包括. )两个字符串
|
file_name = os.path.basename("CC/DD/3.txt")
print(file_name)
print(os.path.dirname("CC/DD/3.txt"))
end_str = os.path.splitext("1.txt")
print(end_str)执行结果为:|3.txt|CC/DD|('1', '.txt')
五. sys模块 常用命令
首先需要导入sys
模块import sys
命令 | 描述 |
---|---|
sys.argv
|
命令行参数 List,第一个元素是程序本身路径 |
sys.modules.keys()
|
返回所有已经导入的模块列表 |
sys.exc_info()
|
获取当前正在处理的异常类exc_type 、exc_value 、exc_traceback 当前处理的异常详细信息
|
sys.exit(n)
|
退出程序,正常退出时 exit(0)
|
sys.hexversion
|
获取 Python 解释程序的版本值,16 进制格式如:0x020403F0 |
sys.version
|
获取 Python 解释程序的版本信息 |
sys.maxint
|
最大的 Int 值
|
sys.maxunicode
|
最大的 Unicode 值
|
sys.modules
|
返回系统导入的模块字段,key 是模块名,value 是模块
|
sys.path
|
返回模块的搜索路径,初始化时使用 PYTHONPATH 环境变量的值
|
sys.platform
|
返回操作系统平台名称 |
sys.stdout
|
标准输出 |
sys.stdin
|
标准输入 |
sys.stderr
|
错误输出 |
sys.exc_clear()
|
用来清除当前线程所出现的当前的或最近的错误信息 |
sys.exec_prefix
|
返回平台独立的 python 文件安装的位置 |
sys.byteorder
|
本地字节规则的指示器,big-endian 平台的值是'big' ,little-endian 平台的值是'little'
|
sys.copyright
|
记录 python 版权相关的东西 |
sys.api_version
|
解释器的 C 的API 版本
|
sys.version_info
|
元组则提供一个更简单的方法来使你的程序具备 Python 版本要求功能 |
5.10 unittest 是什
六. random模块(随机数)常用命令
首先需要导入random
模块import random
命令 | 描述 |
---|---|
random.random()
|
生成一个 0-1 之间的随机浮点数 |
random.uniform(a, b)
|
生成[a,b]之间的浮点数 |
random.randint(a, b)
|
生成[a,b]之间的整数 |
random.randrange(a, b, step)
|
在指定的集合[a,b)中,以 step 为基数随机取一个数 |
random.choice(指定序列)
|
从特定序列(字符串、列表、元组等)中随机取一个元素 |
random.shuffle(指定序列)
|
打乱指定序列 |
datatime
计算两个时间的差值(天)
import datetimedate2 = datetime.date(year=2021, month=3, day=12)
date1 = datetime.date(year=2021, month=5, day=17)
print(date1 - date2, type(date1 - date2))
print(int(str(date1 - date2).split(" ")[0]) + 1 )
字符串时间格式化 及 计算年龄
from datetime import datetime
from datetime import datebirthday="2019-04-10"
born = datetime.strptime(birthday, '%Y-%m-%d')today = date.today()
age = today.year - born.year - ((today.month, today.day) < (born.month, born.day))
获取两个时间之间的时间列表
import time
from datetime import datetimedef datelist(beginDate, endDate):date_list=[datetime.strftime(x,'%Y-%m-%d') for x in list(pd.date_range(start=beginDate, end=endDate))]return date_listdl = datelist("2021-05-05", time.strftime("%Y-%m-%d", time.localtime()))
数据加密
pickle模块
:Python
数据的序列化操作,可以将数据转换为bytes
类型pickle.dumps()
:将Python
数据序列化为bytes
类型数据pickle.loads()
:将bytes
类型数据反序列化为python
数据
base64模块
:对bytes
类型数据进行编码,并得到加密得bytes
类型的密文base64.b64encode()
:将bytes
类型数据进行base64
编码,返回编码后的bytes
类型数据base64.b64deocde()
:将base64
编码后的bytes
类型数据进行解码,返回解码后的bytes
类型数据
# 加密
def dumps(data):# 1.将数据装换成bytesdata_bytes = pickle.dumps(data)# 2.将bytes使用base64序列化加密base64_bytes = base64.b64encode(data_bytes)# 3.将加密完毕的bytes以字符串类型输出base64_str = base64_bytes.decode()return base64_str# 解密
def loads(data):# 1.将字符串数据转化成字节数据data_bytes = data.encode()# 1.将数据解密转成bytesbase64_bytes = base64.b64decode(data_bytes)# 2.将bytes转回原来的python类型pickle_data = pickle.loads(base64_bytes)return pickle_data
docker 应用容器框架
- 开源的软件部署解决方案
- 轻量级的应用容器框架
- 可以打包、发布、运行任何的应用
- 客户端-服务端(C/S)架构程序。客户端只需要向服务端发出请求,服务端处理完请求后会返回结果
# 检查Docker是否安装正确(注意:联网状态)
$ sudo docker run hello-world# 启动docker
$ sudo service docker start
# 重启docker
$ sudo service docker restart
# 停止docker
$ sudo service docker stop
Docker
三个基本概念:
镜像(Image)
类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了MySQL或用户需要的其它应用程序。容器(Container)
Docker容器是由Docker镜像创建的运行实例,类似VM虚拟机,支持启动,停止,删除等
每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。仓库(Repository)
Docker的仓库功能类似于Github,是用于托管镜像的
镜像操作
查看所有镜像列表
$ sudo docker image ls 或者 $ sudo docker images
REPOSITORY
:镜像所在的仓库名称TAG
:镜像标签IMAGEID
:镜像IDCREATED
:镜像的创建日期(不是获取该镜像的日期)SIZE
:镜像大小
安装镜像
- 从仓库拉取镜像
# 官方镜像 $ sudo docker image pull 镜像名称 或者 sudo docker image pull library/镜像名称:版本号 $ sudo docker image pull ubuntu 或者 sudo docker image pull library/ubuntu $ sudo docker image pull ubuntu:16.04 或者 sudo docker image pull library/ubuntu:16.04# 个人镜像 $ sudo docker image pull 仓库名称/镜像名称 $ sudo docker image pull itcast/fastdfs
- 从本地导入镜像
# 镜像解压 $ sudo docker load -i 文件路径/镜像文件
- 从仓库拉取镜像
删除镜像
# sudo docker image rm 镜像名或镜像ID $ sudo docker image rm hello-world $ sudo docker image rm fce289e99eb9
注意:仅能删除无容器的镜像,若存在容器,删除会报错,应先删除容器
容器操作
查看所有容器列表
# 查看正在运行的容器 $ sudo docker container ls # 查看所有的容器 $ sudo docker container ls --all
CONTAINER ID
:容器IDIMAGE
:容器所属镜像COMMAND
:进入容器后执行的第一条命令CREATED
:容器的创建日期(不是获取该镜像的日期)STATES
:容器状态(up
表示存活,exited
表示关闭)PORTS
:端口NAME
:容器名称
创建容器
$ sudo docker run [option] 镜像名 [向启动容器中传入的命令]常用可选参数说明:-i 表示以《交互模式》运行容器。-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。--name 为创建的容器命名。-v 表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 -d 会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。 -p 表示端口映射,即宿主机端口:容器中端口。--network=host 表示将主机的网络环境映射到容器中,使容器的网络与主机相同。例:创建tracker容器将 tracker 运行目录映射到宿主机的 /var/fdfs/tracker目录中 $ sudo docker run -dit --name tracker --network=host -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker $ sudo docker run -dti --name storage --network=host -e TRACKER_SERVER=192.168.103.158:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
停止和启动容器
# 停止容器 $ sudo docker container stop 容器名或容器id # kill掉容器 $ sudo docker container kill 容器名或容器id # 启动容器 $ sudo docker container start 容器名或容器id
删除容器
$ sudo docker container rm 容器名或容器id
注意:正在运行的容器无法直接删除,需要不关闭
容器制作成镜像导出
为保证已经配置完成的环境可以重复利用,我们可以将容器制作成镜像导出方便别人和以后使用- 将容器制作成镜像
# 将容器制作成镜像 $ sudo docker commit 被导出的容器名 生成的镜像名
- 将镜像导出
# 镜像打包备份 $ sudo docker save -o 保存的文件名 被打包的镜像名
- 加载导出的镜像
# 镜像解压 $ sudo docker load -i 文件路径/备份文件
- 将容器制作成镜像
Git
向当前分支提交文件:git commit
新建分支:git branch <新分支名> 指定索引位置
若在当前位置HEAD
新建则索引位置可省
切换分支:git checkout <指定分支>
新建并切换到分支上:git checkout -b <新分支名>
将两个分支合并到一起:
每个分支有各自独有的提交,合并后的分支包含了两分支对代码库的所有修改
git merge 指定分支名
:将指定分支名的分支合并到当前工作分支例:把 bugFix 合并到 master(工作分支) 上(如下图) git merge bugFix 例:把 master(工作分支) 合并到 bugFix: git checkout bugFix; git merge master
git rebase 分支名1 分支名2
:把分支2复制到分支1之后,若分支2为HEAD
则可省略
优势:创造更线性的提交历史,合并后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的# 将当前分支bugFix 复制到main之后(如图) git rebase main# 将main和bugFix 合并 git checkout main git rebase bugFix 或者 git rebase bugFix main
HEAD:对当前工作记录,即正在其基础上进行工作的提交记录
- HEAD 指向当前分支上最近一次提交记录
- 可以通过 cat .git/HEAD 查看
- 若HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向
分离 HEAD:让其指向了某个具体的提交记录而不是分支名
在命令执行之前的状态如下所示:
HEAD -> 分支名 -> 最新提交记录# 方法一:绝对索引修改
git checkout 某提交记录
现在变成了
HEAD -> 某提交记录(哈希类型,可通过 git log 查看提交记录的哈希值)# 方法二:相对索引修改
git checkout 某分支名位置或HEAD位置^或~<num>
例:git checkout bugFix^^ # 表示将HEAD移动至bugFix分支上两个父提交记录(一个^表示一个)
git checkout HEAD~3 # 表示将HEAD往上移动三个父提交记录git checkout HEAD~^2~2 # ^2表示移至合并的第二个父节点,如下图(HEAD从main处开始移动)
修改 Git 提交树:
- 绝对索引:将指定分支名强行修改至某提交记录节点
git branch -f 分支名 某提交记录
- 相对索引:将指定分支名强行修改至 某分支点或HEAD的提交位置或父提交位置
git branch -f 分支名 某分支名位置或HEAD位置^或~<num>
用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向# 例:将下图的蓝色取与Git树改成粉色区域的样子 # 修改HEAD提交记录位置 git checkout HEAD^ # 绝对索引修改main分支的提交记录位置 git branch -f main C6# 相对索引修改 bugFix分支的提交记录位置git branch -f bugFix bugFix~3
撤销变更(将提交撤回)
- 本地撤销(还未pull到远程):
git reset HEAD^
- 远程撤销(遗留撤销记录):
git revert HEAD~3
此时git revert HEAD
等价于git revert HEAD^
整理提交记录:
- 复制提交记录至HEAD之后:
git cherry-pick <哈希提交号1> <哈希提交号2> <哈希提交号3> ...
例:将C2和C4提交记录复制到HEAD之后 git cherry-pick C2 C4
- 交互式
rebase
:git rebase -i 新分支的父节点
UI 界面交互式选择新分支下要复制的提交记录并自定义可顺序(可选提交记录:HEAD至新分支父节点之间的所有提交记录)
贴标签:git tag 标签名 提交位置
若省略提交记录位置,则表示标签贴到HEAD
处
标签:在代码库中起着“锚点”的作用
查看最近标签: git describe 调教记录索引
绝对索引和相对索引皆可
git describe C3 # 绝对索引 提交记录哈希值
git describe main # 相对索引 分支名,葫芦哦索引表示HEAD位置输出:距离索引最近的标签_距离几个提交记录_g索引哈希值
例: git describe C7 ==> v1_2_gC7 # 表示C7记录距离最近的v1标签2个提交记录位置
远程仓库操作
在本地创建一个远程仓库拷贝:git clone
- 本地仓库:多了一个名为
o/master
的分支, 表示远程分支,反映了远程仓库(在你上次和它通信时)的状态
因为远程分支不能直接操作,因此git commit
时自动进入分离 HEAD
远程分支有一个命名规范:<remote name远程仓库名>/<branch name分支名>
;例:o/master
,其中o
表示默认远程仓库名origin
的缩写,分支名master
同步远程仓库的数据:
git pull
:以下方法的简写;--rebase
参数表示使用rebase方法
合并,默认使用merge
合并
git pull origin foo
相当于:git fetch origin foo; git merge o/foo
git fetch + git rebase o/master
作用:git fetch
- 从远程仓库下载本地仓库中缺失的提交记录
- 更新远程分支指针(如
o/main
)
注意:
git fetch
并不会改变你本地仓库的状态,也不会修改你磁盘上的文件,也不会更新你的分支
git fetch origin foo
:到远程仓库的 foo 分支上,然后获取所有本地不存在的提交,放到本地的 o/foo 上合并本地和远程数据:
# 合并结果的数据一致,但git树不同 git cherry-pick o/master git rebase o/master # 线型复制 git merge o/master # 会显示合并过程
将本地数据上传远程:git push
提交时若有同事已经先提交过,会提交失败。需要先git pull [--rebase]
后在git push
参数:git push origin main
:切到本地仓库中的main
分支,获取所有的提交,再到远程仓库origin
中找到main
分支,将远程仓库中没有的提交记录都添加上去
git push origin <本地分支来源>:<远程指定分支>
可以将本地的foo 分支
推送到远程仓库中的 bar 分支
上,若远程分支名不存在,则会新建远程分支
# 例:下图的蓝色取与git树 改成 粉色区域 树
git clone # 根据本地仓库创建远程仓库
git fakeTeamwork # 模拟同事已经先提交记录C2
# git push 此时上传会失败,因为远程仓库已经存在冲突提交记录
git pull --rebase # 拉取同事提交的代码
git push # 上传合并同事代码后的代码
推送锁定的主分支:
- 直接推送报错:
! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)
- 解决方法:
- 撤销本地主分支的提交记录 于远程一致
git reset --hard o/master
- 查看冲突代码
git status
- 返回新建分支
git checkout -b 新分支名 最新提交记录索引
# 最新提交记录索引就是本地主分支撤销前的本地提交记录 - 推送分支并申请
pull request
git push origin feature
- 撤销本地主分支的提交记录 于远程一致
远程追踪:
git checkout -b 新分支名 o/main
,跟踪远程分支o/main
git branch -u 要追踪的远程分支 新分支名
,执行:git branch -u o/main foo # 这样 foo 就会跟踪 o/main # 如果当前就在 foo 分支上, 还可以省略 foo: git branch -u o/main
APScheduler定时器
- 一款Python开发的定时任务工具
- 不依赖于Linux系统的crontab系统定时,独立运行
- 可以动态添加新的定时任务
如:下单后30分钟内必须支付,否则取消订单,就可以借助此工具(每下一单就要添加此订单的定时任务) - 对添加的定时任务可以做持久保存
使用方式
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor# 设置执行器
executors = {'default': ThreadPoolExecutor(20)}# 创建定时任务的调度器对象
scheduler = BackgroundScheduler(executors=executors)# 定义定时任务
def my_job(param1, param2):pass# 使用触发器向调度器中添加定时任务
scheduler.add_job(my_job, 'date', args=[100, 'python'])# 启动定时任务调度器工作
scheduler.start() # 参数(paused=True):修剪不需要的作业# 暂停计划作业的处理:
scheduler.pause()# 恢复暂停的作业
scheduler.resume()# 停止APScheduler运行
scheduler.shutdown() # 参数wait=False:不会等待任何正在运行的任务完成
调度器 Scheduler
:负责管理定时任务
from apscheduler.schedulers.blocking import BlockingScheduler# BlockingScheduler: 作为独立进程时使用
scheduler = BlockingScheduler()
scheduler.start() # 程序会阻塞在这,防止退出from apscheduler.schedulers.background import BackgroundScheduler# BackgroundScheduler: 后台运行,在框架程序中使用
scheduler = BackgroundScheduler()
scheduler.start() # 程序会立即返回,后台运行
执行器 executors
:在定时任务该执行时,以进程或线程方式执行任务
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.executors.pool import ProcessPoolExecutor# ThreadPoolExecutor(max_workers) 最多 max_workers 个线程同时执行
# ProcessPoolExecutor(max_workers) 最多 max_workers 个进程同时执行
executors = {'default': ThreadPoolExecutor(20)}
# executors = {'default': ProcessPoolExecutor(3)}
scheduler = BackgroundScheduler(executors=executors)
触发器 Trigger
:指定定时任务执行的时机
在特定的时间日期执行:
date
from datetime import date# 添加任务 # 在2019年11月6日00:00:00执行 sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), id='任务ID') # 在2019年11月6日16:30:05 sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5)) sched.add_job(my_job, 'date', run_date='2009-11-06 16:30:05')# 立即执行 sched.start() sched.remove_job('任务ID') # 删除指定任务 sche.pause_job('任务ID') # 暂定指定任务 sche.resume_job('任务ID') # 恢复指定任务
指定时间间隔执行:
interval
# weeks(int) / days(int) / hours(int) / minutes(int) / seconds(int) # start_date(datetime|str) / end_date(datetime|str) / timezone(datetime.tzinfo|str) 用于计时的时区,默认为调度器时区 from datetime import datetime# 每两小时执行一次 sched.add_job(job_function, 'interval', hours=2) # 在2010年10月10日09:30:00 到2014年6月15日的时间内,每两小时执行一次 sched.add_job(job_function, 'interval', hours=2, start_date='2010-10-10 09:30:00', end_date='2014-06-15 11:00:00')# job = scheduler.add_job(myfunc, 'interval', minutes=2) # 添加任务 # job.remove() # 删除任务 # job.pause() # 暂定任务 # job.resume() # 恢复任务
按指定的周期执行:
cron
# year(int|str) 四位数 / month(int|str) 取值(1-12) / day(int|str) 取值(1-31) / week (int|str) 取值(1-53) # day_of_week(int|str) 周几(0-6 or mon,tue,wed,thu,fri,sat,sun) / hour(int|str) 取值(0-23) # minute(int|str) 取值(0-59) / second (int|str) 取值(0-59) # start_date(datetime|str) / end_date(datetime|str) / timezone(datetime.tzinfo|str) # 在6、7、8、11、12月的第三个周五的00:00, 01:00, 02:00和03:00 执行 sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')# 在2014年5月30日前的周一到周五的5:30执行 sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2014-05-30')
配置方法:
- 使用进程或线程
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.executors.pool import ThreadPoolExecutorexecutors = {'default': ThreadPoolExecutor(20), } scheduler = BackgroundScheduler(executors=executors)
- 同时使用进程和线程
from pytz import utcfrom apscheduler.schedulers.background import BackgroundScheduler from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore from apscheduler.executors.pool import ProcessPoolExecutorexecutors = {'default': {'type': 'threadpool', 'max_workers': 20},'processpool': ProcessPoolExecutor(max_workers=5) }scheduler = BackgroundScheduler()# .. 此处可以编写其他代码# 使用configure方法进行配置 scheduler.configure(executors=executors)
调整任务调度周期:
# apscheduler.job.Job.modify() 修改任何作业属性modify_job()
job.modify(max_instances=6, name='Alternate name')# 使用 apscheduler.job.Job.reschedule()或 reschedule_job():构造新触发器,并重新计算其下一次运行时间
scheduler.reschedule_job('my_job_id', trigger='cron', minute='*/5')
python 文件操作 和 标准库相关推荐
- Python文件操作学习总结
Python读写文件 1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open( ...
- Python文件操作-文本文件、二进制文件、csv文件的读取写入、OS、shutil、CSV模块、常用字符编码
Python文件操作 文本文件和二进制文件 文件操作相关模块 open()创建文件对象 文件对象的常用属性和方法 pickle 序列化 文本文件读取和写入 文本文件写入步骤 write()/write ...
- python concat函数 多张表_最全Python数据工具箱:标准库、第三方库和外部工具都在这里了 - Mr_YJY...
导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接 ...
- 看了这篇,你也是Python文件操作高手
Python文件操作 文本文件和二进制文件 文件操作相关模块概述 创建文件对象 open() 文本文件的写入 基本的文件写入操作 常用编码介绍 ASCII ISO8859-1 GB2312,GBK,G ...
- java调用第三方dll文件 源码_C++调用python文件(包含第三方库)
本文内容主要参考以下两篇文章: 武军:C++中调用python(VS2017)zhuanlan.zhihu.com C++调用python的那些坑(详细教程步骤)_giser_xupf的博客-CSD ...
- python文件操作实验总结,[干货分享]Python文件操作技巧总结
引言 小伙伴们,今天给大家讲解一下python程序下的文件操作完整技巧梳理,都是笔者总结的干货.通过本文阅读,不仅可以带来生产力提升,也可以开发小脚本为生活带来乐趣. 首先不知道大家对 ...
- 仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题
仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题 0. 前言 1. 第 1 题:命令行日志记录 2. 第 2 题:将日志存储在磁盘上 3. 第 3 题:命令行参数解析 4. ...
- 不是python文件操作的相关函数_从零开始学Python(七):文件存储I/O流和异常捕捉
这两天在搞小程序开发,耽搁了一下更新的进度,今天补上.一个完整的前端程序肯定离不开数据存储和网络两个模块,今天我们就先来讲讲python中的一种常见数据存储:文件存储!~! 文件存储(I/O操作) 何 ...
- Python零基础速成班-第8讲-Python文件操作File IO、高级文件处理模块shutil、CSV、JSON、多线程基础
Python零基础速成班-第8讲-Python文件操作File I&O.高级文件处理模块shutil.CSV.JSON.多线程基础 学习目标 文件操作File I/O 高级文件处理模块shut ...
最新文章
- python等间隔取样
- SpringBoot打包时提示:Perhaps you are running on a JRE rather than a JDK?
- [北航软工]第一次团队作业
- CodeForces - 888G Xor-MST(贪心+字典树+最小生成树)
- H5禁止弹窗页面滚动
- python代码格式
- latex中\left[\right]在多行公式中的问题
- 生成式模型与判别式模型—大厂笔试汇总
- C#基础17:匿名方法与Lambda表达式
- linux命令---ubuntu的vim命令用法
- oracle 闪回总结
- python烟花代码
- Spring Security整合KeyCloak保护Rest API
- 探访广东电子垃圾第一镇:家庭作坊饮鸩止渴---ESM
- PHP下载文件(laravel)
- 南京大学文博专业考研上岸经验分享
- C#开发Active控件
- 单波段彩色变换(伪彩色密度分割)
- html前端几种加密方式的整理
- vs 2019修改C#语言版本