零基础学python 第六章 装饰器、异常和文件读写

装饰器

装饰器本质上就是一个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'}

练习题

工号姓名年龄职务
10123George27SW
10115bob30SW
10150Jack26ST
10212May31PM
  • 把上面的数据整理成字典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的代码微调外,其它代码都不用修改。

工号姓名年龄职务部门
10123George27SWDevelop
10115bob30SWDevlop
10150Jack26STDevelp
10212May31PMProduct
12000Tom28STDevlop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值