掌握python基本语法后,我们可以在骚骚地写一些小脚本,当时总感觉少了点什么?
文件读写
我们要加载外部的文件怎么办?我们要存储自己计算好的数据怎么办呢?这个时候我们需要用到文件读写功能。我们先打开一个文件对象
# file = open(file_name [, access_mode][, buffering])
file_1 = open('python大法是好剑客.txt', 'r') # 只读文件
file_name是文件名或着文件的path,access_mode用来制定文件操作的模式,如果是只读文件,pattern=‘r’; 只写文件,pattern=‘w’,明细参数可以参考下图(来自菜鸟教程); buffering 表示是否寄存,基本不会用到。
然后我们就可以读取文件对象中的内容或者写入内容,常用操作
- 读取: file.readline() 逐行读取; file.readlines()一次性读取所有行 (小文件可以,大文件很危险!)
- 写入:file.write(string) 字符串写入文件;file.writelines(sequence)
# 第一行内容是:你又在胡说八道什么了!
print(file.readline())
除了文件读写,可能还需要补充一些文件路径方面的操作,在os库里面定义了丰富的工具函数
- os.mkdir(dir)新建目录; 加强版os.makedirs() 创建完成的路径目录,比如你在/user下要创建 /user/python/base/helloworld/,在python/base/不存在的情况下,os.makdirs
- os.getcwd() 获取当前目录
- os.rmdir(dir)删除目录,删除操作很危险,尽量少用
- os.path.exists(path) 判断路径是否存在
- os.path.join(str1, str2, str3) 会把str1,str2,str3连接成一个路径。
命令行参数
大家在学python的时候一定会到类似如下的命令
python say_hello.py LiMing
在py脚本后多了一个字符串,你会问它到底是什么?有什么用呢?我们看一下say_hello.py的内部实现
import sys
print("hello, {}! ".format(sys.argv[1]))
其实就是想和遇到的小伙伴套个近乎,但是需要知道小伙伴的姓名,这个使用通过一个命令行参数传递传递进来。sys.argv[ind],ind=0取的是当前运行的脚本名,1才是第一个参数,依次递推。
使用sys.argv的优点是传递参数很简单,有个问题你都不知道传递的参数什么意思?而且还没发给默认参数?那么怎么解决这写问题呢?python大法说,不要慌,我们还有一个神奇的argparse标准, 用法
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str, default="HanMeimei", help="小伙伴的姓名")
args = parser.parse_args()
print("hello, {}! ".format(args.name))
调用方式就改成了
python say_hello.py --name LiMing
如果你没有传参数,系统默认所有的人都是HanMeimei!
打印日志
大家在运行程序的时候,如果程序很长,只是傻傻地等待程序运行结束的话,过程往往很煎熬,而且容易出问题。
比如你的程序有bug,中间结果计算并正确?或者你在做机器学习的时候,初始化参数不好,模型一开始就不收敛,我们需要及时止损。即便不止损,我们知道程序的进度,也还安排晚上是去花天酒地呢?还是继续后续的操作。
那么怎么办呢?最简单的直接方案借助print来打印中间结果/进度条,print函数好
from wuliao import ganhuaishi
count = 0
while (True):
count += 1
ganhuaishi()
if count % 100:
print("hello world!")
每调用ganhuaishi() 函数100次,我们都打印一次hello world!也可以选择打印某些变量,比如在机器学习里面训练模型是往往会打印损失函数、准确率,用来监控模型训练的效果。
但是print函数太简单了,对于大型的应用程序要上日志系统?仅仅用print往往不够用。那么python有木有成熟的日志库呢?python大法又来了,这个必须有啊!它就是logging库,专业日志输出神器。logging不仅能输出到控制台,还能写入文件,使用TCP协议,将日志信息发送到网络等等,功能十分强大, 具体大家参考[4],我不展开了,以后有机会单独讲解(言外之意我还没有搞透!)。可以参考以下代码:
# -*- coding: UTF-8 -*-
import os
import logging
import time
def logger_init(log_dir):
"""初始化日志模块"""
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# 定义输出路径
rq = time.strftime("%Y%m%d%H%M", time.localtime(time.time()))
log_path = os.path.join(log_dir, "{}.log".format(rq))
fh = logging.FileHandler(log_path, mode="w")
fh.setLevel(logging.INFO)
# 定义输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
# 输出到屏幕
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)
logger.addHandler(fh)
logger.addHandler(console)
return logger
if __name__ == "__main__":
logger = logger_init("../logs")
logger.info("hello logger!")
异常处理
最早是在学生阶段知道了异常处理这个东西,但年自己也不是计算机专业,写代码纯粹是为了处理点数据,水个文章。但是总是有的代码跑一半就掉了,但是也不是什么大问题,我就想怎么跳过这些问题呢?某一天有个师兄说,你可以试试try/catch语句(当时还只会用matlab)!
在python中try/except来进行异常捕获,捕获异常后,我们可以进行异常处理,如果不跳出程序,就不会影响后续的代码运行。
try:
ganhuaishi()
except Exception:
print("时候未到!")
print("hello world!")
try的语法
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常:
- 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
- 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
- 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。[5]
当然用try时候很危险啊,因为你把一些异常跳过去了,这个时候except中必须加提示和处理,此次是重点!!!
除了try/except语句,python还提供assert断言语句,用来做一些异常检查,一旦不满足assert语句,程序会立马中断并报错。
比如程序要求输入名字为LiMing,结果输入了HanMeimei,那么
assert name=="LiMing", "请输入LiMing,{} 是乖宝宝".format(name)
assert断言语句个人感觉很好,当你写一个功能的时候对输入、中间结果、输出必须正确把握,做测试的时候就可以用assert来检查一些中间结果,及时止损,免得输掉面包钱![6]
至此你已经学会了python的地基(基础语法,好像还缺函数和面向对象编程,回头补哈)和 砖瓦水泥,能建成怎样的高楼大厦(茅草屋),就看个人修行了。来开始你的表演。
参考
- https://www.liaoxuefeng.com
- https://www.runoob.com/python/python-files-io.html
- https://www.cnblogs.com/dengtou/p/8413609.html
- https://blog.csdn.net/zgf605506394/article/details/88595135
- https://www.runoob.com/python/python-exceptions.html
- https://blog.csdn.net/qq_39247153/article/details/81082313