课堂笔记15-文件的读写

课堂笔记

1. 异常简介

程序在运⾏过程中可能会出现⼀些错误。⽐如: 使⽤了不存在的索引,两个不 同类型的数据相加…这些错误我们称之为异常

处理异常 程序运⾏时出现异常,⽬的并不是让我们的程序直接终⽌!Python 是希望在出现异常时,我们可以编写代码来对异常进⾏处理


# 在程序运行过程当中,不可避免出现一些错误例如 用没有赋值过的变量。类型不同做加法运算..
# 异常以后的代码都不会执行
# print(a) # NameError: name 'a' is not defined

# print(10/0) # ZeroDivisionError: division by zero

# print('hello')
# print(10 / 0)
# print('python')

# 处理异常
# 程序运行时出现异常,目的并不是要终止我们的程序
# Python是希望出现异常时,我们可以编写代码来对异常进行处理

# try语句
# try:
#     代码块 (可能出现错误的语句)
# except 异常类型 as 异常名:
#     代码块 (出现错误之后的处理方式)
# except 异常类型 as 异常名:
#     代码块 (出现错误之后的处理方式)
# except 异常类型 as 异常名:
#     代码块 (出现错误之后的处理方式)
# .....
# finally:
#     代码块
# else:
#     代码块 (没有出错要执行的语句)

print('hello')
try:
    print(10 / 2)
except:
    print('出错了兄弟.....')
else:
    print('程序正常执行没有错误')
print('python')

2. 异常的传播

当在函数中出现异常时,如果在函数中对异常进⾏了处理,则异常不会在进 ⾏传播。如果函数中没有对异常进⾏处理,则异常会继续向函数调⽤传播。 如果函数调⽤处处理了异常,则不再传播异常,如果没有处理则继续向调⽤ 处传播。直到传递到全局作⽤域(主模块)如果依然没有处理,则程序终⽌,并 显示异常信息。

当程序运⾏过程中出现异常以后,所有异常信息会保存到⼀个异常对象中。 ⽽异常传播时,实际上就是异常对象抛给了调⽤处


# 异常的传播
# 当在函数中出现异常时,如果在函数中处理了异常。则异常不会在继续传播
# 如果在函数中没有处理异常,则异常会继续向函数调用出传播
# 如何函数调用处处理了异常,则不在传播。如果没有处理则继续向调用处传播
# 直到传递到全局作用域(主模块)如果依然没有处理,则呈现终止,并显示异常信息

# 当程序运行过程中,出现异常以后,所以的异常信息会被保存到一个专门的异常对象当中
# 而异常传播时,实际上就是异常对象抛给了调用处
# def fn():
#
#     print('hello fn')
#     print(10 / 0)
#
# try:
#     fn()
#
# except:
#     pass

def fn():

    print('hello fn')
    print(10 / 0)

def fn2():

    print('hello fn2')
    fn()


def fn3():
    print('hello fn2')
    fn2()

# fn3()
print(NameError)
--------------------------------------------------------------------------

print('异常出现前')

lst = []

try:
    # print(a)
    # lst + 'hello'
    print(10/0)
# except NameError:
#     # except后不跟任何内容,此时它会捕获所有的异常
#     # print('处理异常的逻辑....')
#     print('出现 NameError异常了')
# except ZeroDivisionError:
#     # except后不跟任何内容,此时它会捕获所有的异常
#     # print('处理异常的逻辑....')
#     print('出现 ZeroDivisionError异常了')
except Exception as e:
    # Exception 是有所有异常类的父类 所有如果except后跟Exception 它会捕获到所有的异常
    print('出现异常了',e,type(e))

finally:
    print('无论是否出现异常,该语句都会执行')

print('异常出现后')





3. 异常对象

1 try语句 
2 try: 
3 代码块(可能出现错误的语句) 
4 except 异常类型 as 异常名: 
5 代码块(出现错误以后的处理⽅式)
 6 except 异常类型 as 异常名: 
7 代码块(出现错误以后的处理⽅式) 
8 except 异常类型 as 异常名: 
9 代码块(出现错误以后的处理⽅式) 
10 .... 
11 else: 
12 代码块(没出错时要执⾏的语句) 
13
14 finally: 
15 代码块(是否出错该代码块都会执⾏) 
16 try是必须的 else有没有都可以
 17 except和finally⾄少有⼀个 
18 

4. ⽂件打开

⽂件(file) 通过Python程序来对计算机中的各种⽂件进⾏增删改查的操作 ⽂ 件也叫I/O(Input/Output)

⽂件的操作步骤
打开⽂件
对⽂件进⾏各种操作(读、写)然后保存
关闭⽂件
⽂件会有⼀个返回值。返回⼀个对象,这个对象就表示的是当前的⽂件

# 文件(File)(IO Input/Output)
# 通过Python程序对计算机的各种文件进行增删改查的操作
# 操作文件的步骤 1.打开文件 2.对文件进行各种操作(读写)然后保存 3.关闭文件

# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# 返回值 返回了一个对象 这个对象代表的就是当前打开的文件
# 如果目标文件和当前文件在同一级目录下,直接使用文件名即可
file_name = 'demo.txt'

file_name = 'D:\JerryProject\基础\demo.txt'

file_obj = open(file_name) # 打开对应的文件

print(file_obj)
-----------------------------------------------------------------------------
file_name = 'demo4.txt'

with open(file_name,'x',encoding='utf-8') as file_obj:

    # write()来向文件中写入内容
    # 如果操作的是一个文本文件的时候,则需要传递一个字符串作为参数
    # r表示只读
    # w表示可以写
    # a表示追加
    # x 表示用来创建新的文件,如有文件不存在则创建,如果存在就报错
    # FileExistsError: [Errno 17] File exists: 'demo.txt'
    # file_obj.write('nice to meet you') # io.UnsupportedOperation: not writable
    file_obj.write('abc\n')
    file_obj.write('def')
    file_obj.write('wxy')
    r = file_obj.write(str(123)+'\n') # TypeError: write() argument must be str, not int
    print(r)
---------------------------------------------------------------------------
file_name = 'demo.txt'

with open(file_name,encoding='utf-8') as file_obj:

    # print(file_obj.read())
    # readline()该方法用来读取一行的内容
    # print(file_obj.readline(),end='')
    # print(file_obj.readline())
    # print(file_obj.readline())
    # readlines() 它会一次性读取文件内容以列表形式返回
    r = file_obj.readlines()
    print(r[0])
-------------------------------------------------------------------------------

file_name = 'demo.txt'
try:
    with open(file_name,encoding='utf-8') as file_obj:

        # 定义一个变量 来保存结果
        file_content = ''

        # 定义一个变量 指定每次读取的大小
        chunk = 100
        # 创建一个循环来读取内容
        while True:

            content = file_obj.read(chunk)

            # 检查是否读完文件
            if not content:
                # 内容读取完毕退出循环
                break
            # print(content,end='')
            file_content += content

except FileNotFoundError:
    print(f'{file_name}文件不存在.....')
print(file_content,end='')



5. 关闭⽂件

调⽤close()⽅法来关闭⽂件
with…as 语句不⽤写close()来关闭。它⾃带关闭


# file_name = 'demo.txt'

# file_obj = open(file_name)
#
# # read()函数 用来读取文件的内容,它会将内容全部保存到一个字符串返回
#
# content = file_obj.read()
#
# print(content)
#
# # 关闭文件
# # 调用close()函数来关闭文件
# file_obj.close()

# file_obj.read() # ValueError: I/O operation on closed file.

# with...as...语句 不用写close()
file_name = 'demo.txt'
try:
    with open(file_name) as file_obj:


        print(file_obj.read())
except FileNotFoundError:
    print(f'{file_name}文件不存在.....')

# print(file_obj.read()) ValueError: I/O operation on closed file.



6. 读取⽂件

通过read()来读取⽂件的内容
调⽤open()来打开⼀个⽂件,可以将⽂件分为2中类型 ⼀种 纯⽂本⽂件(使⽤utf-8编码编写的⽂件) ⼀种 ⼆进制⽂件(图⽚ mp3 视频…) open()打开⽂件时,默认是以⽂本⽂件的形式打开的 open()默认的编码 为None。所以处理⽂本⽂件时要指定编码


# 调用open()函数打开一个文件时,可以将文件分为2种类型
# 一种纯文本
# 一种是二进制文件


file_name = 'demo2.txt'
try:
    with open(file_name,encoding='utf-8') as file_obj:
        # 对于较大的文件不要直接使用read()
        # help(file_obj.read)
        content = file_obj.read(6)
        content = file_obj.read(6)
        content = file_obj.read(6)
        content = file_obj.read(6)
        print(content)
        print(len(content))



except FileNotFoundError:
    print(f'{file_name}文件不存在.....')



7. 较⼤⽂件的读取

通过read()读取⽂件内容时会将⽂件中所有的内容全部读取出来。如果对于 读取的⽂件⽐较⼤的话。会⼀次性的将⽂件加载到内容中。容易导致内存泄 露。所以对于较⼤的⽂件。不要直接调⽤read()

read()可以接收⼀个size作为的参数。该参数⽤来指定要读取字符的数量。默 认值为-1.-1也就是要读取全部的内容 每次读取都会从上次读取到的位置开始。如果字符的数量⼩于size。则会读 取所有的。如果读取到最后的⽂件。则会返回空串

readline() 该⽅法⽤来读取⼀⾏

readlines() 该⽅法⽤于⼀⾏⼀⾏的读取内容,它会⼀次性将读取到的内容封 装到⼀个列表当中返回

8. ⽂件的写⼊

write()来向⽂件中写⼊内容
该⽅法可以分多次向⽂件写⼊内容
写⼊完成之后该⽅法会返回写⼊的字符的个数

使⽤open()函数打开⽂件时,必须要指定打开⽂件要做的操作(读、写、追 加)。如果不指定操作类型,则默认是读取⽂件,⽽读取⽂件是不能向⽂件中 写⼊

r 表示只读
w表示可以写。使⽤w写⼊⽂件时,如果⽂件不存在则会创建⼀个⽂件。 如果⽂件存在则会覆盖原⽂件内容

9. ⼆进制⽂件写⼊

读取⽂本⽂件时,size是以字符为单位。读取⼆进制⽂件时,size是以字节 为单位

我们⽤wb来写⼊⼆进制⽂件

10.csv文件的操作

#写入
import csv
with open('test.csv','a', newline='',encoding='utf-8') as f:
    writer  = csv.writer(f)
    writer.writerow(['4', '猫砂', '25', '1022', '886'])
    writer.writerow(['5', '猫罐头', '18', '2234', '3121'])
------------------------------------------------------------
#读出
import csv

with open('test.csv', newline = '', encoding = 'utf-8')  as f:
    #参数encoding = 'utf-8'防止出现乱码
    reader=csv.reader(f)
    for row in reader:
        print(row)



我们也可以用这种方式自学:dir(x),可以查询到x相关的函数,x可以是模块,也可以是任意一种对象。
# 请直接运行并体验代码

a = ''  # 设置一个字符串
print('字符串:')
print(dir(a))    # 把字符串相关的函数展示出来

a = []  # 设置一个列表
print('列表:')
print(dir(a))    # 把列表相关的函数展示出来

a = {}  # 设置一个字典
print('字典:')
print(dir(a))  # 把字典相关的函数展示出来



11.random模块/time模块

import random  # 调用random模块

a = random.random()  # 随机从0-1之间(包括0不包括1)抽取一个小数
print(a)

a = random.randint(0,100)  # 随机从0-100(包括0和100)之间抽取一个数字
print(a)

a = random.choice('abcdefg')  # 随机从字符串,列表等对象中抽取一个元素(可能会重复)
print(a)

a = random.sample('abcdefg', 3) # 随机从字符串,列表等对象中抽取多个不重复的元素
print(a)

items = [1, 2, 3, 4, 5, 6]  # “随机洗牌”,比如打乱列表
random.shuffle(items)
print(items)

--------------------------------------------------------------
# 请直接运行并体验代码

import random  # 调用random模块

print(dir(random))
--------------------------------------------------------
import time   

print('第一句话,过两秒出现第二句。')
time.sleep(2)
print('第二句话。')


===================================================
time模块和random模块是Python的系统内置模块,也就是说Python安装后就准备好了这些模块供你使用。

此外,Python作为一门胶水语言,一个强大的优势就是它拥有许多第三方的模块可以直接拿来使用。

如果是第三方编写的模块,我们需要先从Python的资源管理库下载安装相关的模块文件。

下载安装的方式是打开终端,Windows用户输入pip install + 模块名;苹果电脑输入:pip3 install + 模块名,点击enter即可。(需要预装python解释器和pip)

比如说,爬虫时我们会需要用到requests这个库(库是具有相关功能模块的集合),就需要在终端输入pip3 install requests(Mac用户)的指令。

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

自编模块的导入演示
story.py
sentence = '从前有坐山,'

def mountain():
    print('山里有座庙,')

class Temple:
    sentence = '庙里有个老和尚,'
    def reading(self):
        print('在讲一个长长的故事。')
------------------------------------------------------------------------------------
main.py
import story

if __name__ == '__main__':
    print(story.sentence)
    story.mountain()
    A = story.Temple()
    print(A.sentence)
    A.reading()
    print()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章