Python-11-Python文件和异常

11-1 文件的读取

1. open()函数

open(file, mode='r', buffering=1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

(1) 参数说明:
file: 必须,文件路径(相对或绝对路径)
mode: 可选,文件打开模式
encoding: 一般使用utf-8
buffering: 设置缓冲
errors: 报错级别
newline:分区换行符
closefd: 传入的file参数类型

mode 常用参数:
r: 以只读方式打开文件
w: 只写方式,若文件不存在创建文件,若文件已存在则覆盖原文件。
a: 打开一个文件追加写入,若文件已存在则在最末尾处追加,若文件不存在,则新建文件进行写入。

更多mode参数见:http://www.runoob.com/python/file-methods.html //Python菜鸟教程 TODO

(2) 文件读取格式

with open('file_path', mode='r', encoding='utf-8') as f:
    data = f.read() #返回整个文件数据
    data1 = f.readline() #返回一行数据
    data2 = f.readlines() #以列表格式返回整个文件数据

(4) 文件写入格式

with open(file='file_path', mode='w', encoding='utf-8') as f
    file.write(str) #字符串写入文件
    file.writelines(sequence) #向文件写入一个序列字符串列表,需要需要换行则需要自己加上换行符


2. Pycharm实验

在工程中文件名上右键,Copy Path可以获取文件的绝对路径。

f = open('file name', mode='r', encoding='utf-8')
data = f.read()
print(data)
f.close() #必须要调用这个函数

with open('file name', mode='r', encoding='utf-8') as f: #以文本记的方式打开,不需要显示的调用close()
    data = f.read()
    print(data)

with open('file name', mode='r', encoding='utf-8') as f: 
    data = f.readline() #默认返回首行
    data1 = f.readlines()
    prnt(data1[0]) #打印第一行

使用相对路径 files 目录和 main.py 在同一目录下,所以:with open('files/文本.txt', mode='r', encoding='utf-8') as f:

这里文件读取也是有位置指针的概念


11-2 文件的写入

1. 覆盖写入

with open('files/n1.txt', mode='w', encoding='utf-8') as f:
    f.write('hello lemon\nhello world')
    f.writelines(['hello pycharm\n', 'hello apple\n', 'hello'])

2. 追加写入

with open('files/n1.txt', mode='a', encoding='utf-8') as f:
    #f.write('hello lemon\nhello world')
    f.writelines(['hello pycharm\n', 'hello apple\n', 'hello\n'])

 

11-3 JSON与文件读写

1. JSON(JavaScript Object Notation)特点
JSON是一种轻量级的数据交换格式,易于阅读和编写。具有通用性,支持就所有语音。支持跨平台,支持Windows,Linux,Mac平台。

2. 常用JSON函数
json.dumps: 将Python对象编码成JSON字符串
json.loads: 将已编码的JSON字符串解码为Python对象
json.dump: 将JSON字符串数据写进文件
json.load: 读取JSON文件里面的数据

Python:{'python':1, 'Java':2, 'Hadoop':3}
JSON: '{"python":1, "Java":2, "Hadoop":3}'

3. Python 与 JSON 类型转换

-----------------------
Python      JSON
-----------------------
dict        object
list,tuple  array
str         string
int,float   number
True        true
False       false
None        null
-----------------------

4. 例子

#将Python对象编码成JSON字符串
import json
p_list = [
    {'lemon':True, 'apple':6},
    {'pear':6, 'banana':False},
]
p_dict = {'python':1, 'Java':2, 'Hadoop':None}

json_list = json.dumps(p_list)
json_dict = json.dumps(p_dict)
print(json_list) #[{"lemon": true, "apple": 6}, {"pear": 6, "banana": false}]
print(json_dict) #{"python": 1, "Java": 2, "Hadoop": null}
pass #也在pycharm中这里打个断点,然后鼠标点在代码上看

#将已编码的JSON字符串解码为Python对象
list1 = json.loads(json_list)
dict1 = json.loads(json_dict)
print(list1) #[{'lemon': True, 'apple': 6}, {'pear': 6, 'banana': False}]
print(dict1) #{'python': 1, 'Java': 2, 'Hadoop': None}

#JSON文件读写
import json
def f2():
    p_dict = '{"python":1, "java":2, "Hadoop":null, "lemon":true, "banana":false}' #注意格式和python中的字典不同
    #写入
    with open("files/n2.jaon", 'w', encoding='utf-8') as f:
        json.dump(p_dict, f) #此时n2.json文件中的内容:"{\"python\":1, \"java\":2, \"Hadoop\":null, \"lemon\":true, \"banana\":false}"
    #读取
    with open("files/n2.jaon", 'r', encoding='utf-8') as f:
        data = json.load(f) #返回json字符串格式
        data1 = json.loads(data) #将json字符串格式转化为python对象格式,注意传参是data
        print(data)  #{"python":1, "java":2, "Hadoop":null, "lemon":true, "banana":false} json字符串格式
        print(data1) #{'python': 1, 'java': 2, 'Hadoop': None, 'lemon': True, 'banana': False} 已经转换成python对象格式
f2()

 

11-4 try-except-finally捕捉异常

1. 什么是异常异常即是一个事件,该事件会在程序执行过程中发生,影响了晨程序的正常执行。一般情况下,Python无法正常处理程序时就会发生一个异常。异常就是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行

2. 捕获异常的基本格式

try:
    语句一 #检测语句一是否存在错误
excep 异常名称:
    语句二 #若语句一存在错误,这里可以捕获错误
finally:
    语句三 #无论是否存在错误,都会执行finally内代码

3. 常见异常

BaseException: 所有异常错误
Exception: 常规异常错误
ZeroDivisionError: 除0异常错误
ValueError: 值类型异常错误

更多异常见:https://www.runoob.com/python/python-exceptions.html

4. 例子

def f(num):
    try:
        5 / num
    except ZeroDivisionError as e: #将报错信息传递给变量e
        print(e)
    finally:
        print('执行结束')

f(1) #执行结束
f(0)
----------------
division by zero
执行结束

=======================

def f(num):
    try:
        return int(num)
    except ValueError as e:
        print(e)
    finally:
        print('执行结束')
f(1)
----------------------
执行结束
1

f('a') #没办法将字符串转换为数字
----------------------
invalid literal for int() with base 10: 'a'
执行结束

还可以同步捕获多个异常:

def f(num):
    try:
        return 8/int(num)
    except ZeroDivisionError as e:
        print(e)
    except ValueError as e:
        print(e)
    finally:
        print('执行结束')
f(0) #division by zero
f('a') #invalid literal for int() with base 10: 'a'

#下面这样写也行
def f(num):
    try:
        return 8/int(num)
    except (ZeroDivisionError,ValueError) as e: #写在一行
        print(e)
    finally:
        print('执行结束')

捕获所有异常,推荐使用这种方法:

def f(num):
    try:
        return 8/int(num)
    except BaseException as e: #这个的报错信息和上面是一样的
        print(e)
    finally:
        print('执行结束')
f(0) #division by zero
f('a') #invalid literal for int() with base 10: 'a'

 

11-5 raise 与 assert

1. 除了可以使用 try-except-finally 格式来捕获异常外,还可以通过 raise 显示地引发异常,一旦引发raise后面的异常,程序将终止运行

例子:

#需求1:传入一个参数,若不是int类型抛出异常终止程序
#需求2:判断小于5则抛出异常终止程序
def f2(num):
    if not isinstance(num, int): #判断变量是否是指定类型
        raise Exception('参数不是一个int类型')
    if num < 5:
        raise Exception('参数小于5')
f2('a') #Exception: 参数不是一个int类型
f2(1) #没有执行到

#需求2: 若参数个数小于5抛出异常终止程序
def f2(*args):
    if len(args)<5:
        raise Exception('参数个数小于5')
f2(1,2,3,4) #Exception: 参数个数小于5


2. raise断言

assert的异常参数,其实就是在断言表达式后添加的字符串信息,用来解释断言并更好地知道哪里出了问题。基本格式如下:

assert expression [, arguements] #条件不成立抛出异常

例子:

def f2(num):
    assert isinstance(num, int),'参数不是一个int类型'
    assert num>=5,'参数小于5'
f2(1) #AssertionError: 参数小于5 条件为假时报错

 

参考:

Python 文件I/O: https://www.runoob.com/python/python-files-io.html

 

posted on 2023-08-01 15:55  Hello-World3  阅读(63)  评论(0编辑  收藏  举报

导航