装饰器
装饰器本质上就是一个python函数,可以增加额外的功能。零基础初学者可以可以先只知道有装饰器,且可以这样用就可以了。
比如,我写了个装饰器函数 print_function_name()打印函数名称的功能。
@print_function_name()
def my_function():
pass
这里 @print_function_name() 就是我们使用装饰器。如果不用装饰器,调用my_function()肯定是不会有输出的,但是加上这个装饰器后,调用my_functio()就会输出它的名称。
>>> my_function()
my_function
以下是装饰器函数的定义,初学者只要看看就好了,不用深入了解。
def print_function_name():
def decorate_function(f):
def func(*args, **kwargs):
print(f.__name__)
return f
return func
return decorate_function
零基础初学者只要知道,如果别人告诉你这样一个装饰器函数,你知道怎么样拿着用就可以了。
异常
关键字
- try
- except
- finally
一段有报错的python代码:
>>> num = 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
这段有报错的代码,报错后会提示报错信息后退出运行。
但是很多时候遇到报错,希望还能继续往下运行。报错信息打印出来就可以了。
这时可以捕获报错,使得程序继续运行:
>>> try:
... num = 1 / 0
... except:
... print('exception')
... print('the end')
...
exception
the end
也可以再加上finally段。finally为不管是否报错都会运行的语句块:
>>> try:
... num = 1 / 0
... except:
... print('exception')
... finally:
... print('finally after')
... print('the end')
...
exception
finally after
the end
- 报错后会运行到except段。不管是否报错,都会运行到finally语句块。
- except关键字后面是可以接具体的报错类型的,这里不接任何类型表示会捕获所有的报错。
- finally 语句块不是必要的。
文件读写
打开文件
使用open()打开文件,以下代码为打开 test.txt 文件,赋值给f,然后就可以通过 f 操作文件了。
f = open('test.txt')
不过这样是只读方式打开文件,只能通过f读文件,不能写文件。怎么样才能写文件了?可以配置不同的文件模式来实现。如下面的方式打开后,就可以写文件了:
f=open('test.txt', 'w')
文件模式
值 | 描 述 |
---|---|
‘r’ | 读取模式(默认值),只能读不能写,文件必须存在 |
‘w’ | 写入模式,只能写不能读,会清空文件,文件不存在会新建文件 |
‘a’ | 附加模式,能写不能读,不清空文件,文件不存在会新建文件 |
‘+’ | 读写模式(与其他模式结合使用, 如‘r+’),能读也能写 |
比如我们想如果文件存在就清除文件内容,如果文件不存在就创建文件,然后把数据保存到该文件中,则可以使用以下方式打开文件:
f=open('test.txt', 'w+')
文件基本方法
- read()
读取文件内容。可以带数字参数,参数为读取的字符数量,如 f.read(4) 会读取4个字符。也可以不带参数,读取整个文档。 - readline()
从文件中读取一行。 - readlines()
从文件中读取所有的行,以序列返回,每个元素为一行。 - write()
写文件,参数为需要写入文件的内容。如: f.write(‘hello world’) - close()
文件操作完成后,一定要记得调用 close() 关闭文件。 - seek()
文件读时或者写时,文件中都会有一个指针。比如读文件的指针指到了文件末尾,再读数据就返回空了。我们可以通过seek()函数调整指针的位置。
>>> f = open('test.txt', 'w+')
>>> f.write('line1\n')
6
>>> f.writeline('line2')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: '_io.TextIOWrapper' object has no attribute 'writeline'
>>> f.write('line2\n')
6
>>> f.write('line3\n')
6
>>> f.read(6)
''
>>> f.seek(0)
0
>>> f.read(6)
'line1\n'
>>> f.readline()
'line2\n'
>>> f.seek(0)
0
>>> f.read()
'line1\nline2\nline3\n'
>>> f.seek(0)
0
>>> f.readlines()
['line1\n', 'line2\n', 'line3\n']
>>> f.close()
>>>
- 使用 open() 打开了‘test.txt’文件,文件模式为 w+ ,文件不存在就创建,文件存在会清空文件内容。
- 调用 write() 写入‘line1\n’, '\n’为换行符表示换行,返回数字6,表示写入了6个字符。
- writeline(‘line2’)运行后报错,因为没有writeline()函数,调用write()函数就可以实现了。
- 第一次调用的 read(6) 返回为空,因为这个时候文件光标指向了文件末尾,所以读不出内容
- 调用seek(0) 把文件光标指向文件开始,然后再调用 read(6)读取了6个字符
- readline()读取一行的内容
- read()读取了整个文件的内容,以一个字符串形式返回
- readlines()也是读取了整个文件的内容,不过是以列表的形式返回。列表的每个元素为一行。
- 最后要记得使用 close()关闭文件
一种安全的使用方法 with
>>> with open('test.txt', 'w+') as f:
... f.write('hello world')
... f.read()
...
hello world
>>>
使用with,是一种安全且方便的调用方式,运行完 with的语句块后,文件会自动关闭。建议我们写文件读写的代码时,都使用 with语句。
os模块中的文件操作
函数 | 功能 |
---|---|
os.path.realpath(path) | 获取路径 |
os.path.join(str1, str2, …) | 把两个或者多个,目录名或者名字连接起来。 |
os.path.exists(path) | 判断路径是否存在 |
os.path.isdir(path) | 判断路径是否为文件夹 |
以下是使用这些函数的代码:
import os
file_path = os.path.realpath(__file__) # 获取当前文件的路径
print('current file: ', file_path)
os.mkdir('log') # 本文件所在目录下创建 log 文件夹
print('{} is exist?'.format(file_path), os.path.exists(file_path))
print('{} is path?'.format(file_path), os.path.isdir(file_path))
print(os.path.join('c:', 'program'))
由于这些代码需要使用到代码所在文件的操作,所以请在pycharm中运行。输出的结果大致如下:
current file: F:\workspace_2020\python基础培训\demo\george.py
F:\workspace_2020\python基础培训\demo\george.py is exist? True
F:\workspace_2020\python基础培训\demo\george.py is path? False
c:program
Process finished with exit code 0
非常实用:读取和保存json/yaml文件
json是网络通讯常用的保存数据的格式。把数据保存成json格式的文件,往往很方便网络操作。
但是json格式的文件用文本编辑器打开后,整个只有一行,不方便人工阅读。yaml文件格式就会比较方便大家阅读。
json模块是python自带的模块,直接import就可以了。
yaml模块是第三方库,需要先安装:
pip install PyYAML
这里封装了保存和读取json和yaml的函数,初学者可以先拿着用,逐步熟悉即可:
import json
def save_to_json_file(file_name, json_data):
with open(file_name, 'w') as f:
f.write(json.dumps(json_data))
def read_from_json_file(file_name):
with open(file_name, 'r') as f:
json_data = json.loads(f.read())
return json_data
import yaml
def save_to_yaml_file(file_name, yaml_data):
with open(file_name, 'w') as f:
yaml.dump(yaml_data, f, allow_unicode=True, Dumper=yaml.Dumper)
def read_from_yaml_file(file_name):
with open(file_name, 'r') as f:
yaml_data = yaml.load(f, Loader=yaml.Loader)
return yaml_data
一下是存取json文件的示例:
>>> data = {'a':'abcdefg', 'b':'mfdefgh'}
>>> save_to_json_file('test.json', data)
>>> read_from_json_file('test.json')
{'a': 'abcdefg', 'b': 'mfdefgh'}
练习题
工号 | 姓名 | 年龄 | 职务 |
---|---|---|---|
10123 | George | 27 | SW |
10115 | bob | 30 | SW |
10150 | Jack | 26 | ST |
10212 | May | 31 | PM |
- 把上面的数据整理成字典personnal_dict,以工号为关键字。
- 把 personal_dict 保存成yaml格式的文件 personal.yml。
要求personal.yml文件在上一级目录中存放。
- 另外把 personal_dict 的数据也以文本格式保存成在另一个txt文件 personal.txt,要求打开personal.txt能清晰看到字典中的所有数据内容。
- 然后新建另外一个python文件,实现代码:
– 把 personal.yml 的数据读取出来,在读取出来的数据中找到May的年龄,使用print()打印出来。
– 把 personal.txt 中的数据读取出来,解析并获取到bob的工号,使用print()打印出来。 - 以上代码中,所有的文件读写出错都要求能继续往后运行。如果文件操作出错,使用文字提示“save file error: ”+文件名称 或者 "read file error: "+文件名称。
提高要求 以上程序实现后,增加数据表格维度"部门"和人员信息如下表,要求所有信息也能保存到两个文件中,但是除了整理成 personal_dict的代码微调外,其它代码都不用修改。
工号 | 姓名 | 年龄 | 职务 | 部门 |
---|---|---|---|---|
10123 | George | 27 | SW | Develop |
10115 | bob | 30 | SW | Devlop |
10150 | Jack | 26 | ST | Develp |
10212 | May | 31 | PM | Product |
12000 | Tom | 28 | ST | Devlop |