文件

课题:文件

目的:文件不能可能一直在内存中存储,持久化存储到磁盘就需要用到文件了!

知识点一:文件与上下文管理器(重点)

问题:我们的程序是不是都是运行在内存中的,那内存是不可持久化存储的,那怎样才能持久存储呢?

问题:python怎么去打开一个文件呢?

1、open

f = open(r'test.txt','r')
f.read()  # 需要打印
f.close()
模式 描述
r 以只读方式打开,文件指针默认放在文件开头,文件不存在则报错
r+ 打开一个文件用于读写,文件指针默认放在文件开头,文件不存在则报错
w 打开一个文件只用于写入,如果该文件已存在则将其覆盖,如果不存在,创建新文件
w+ 打开一个文件用于读写,如果该文件已存在则将其覆盖,如果不存在,创建新文件
a 打开一个文件 用于追加,如果文件存在,文件指针会放到文件结尾(也就是说,新的内容将会被写入到已有内容之后),如果不存在,创建新文件进行写入
a+ 打开一个文件用于读写,如果文件存在,文件指针会放到文件结尾,如果不存在,创建新文件进行写入

其他模式:rb rb+ wb wb+ ab ab+ 加b的作用,以二进制的格式打开文件,进行上述操作

实例:
	f = open(r'test2.txt','w+')   # 先清空在写
	print(f.read())
	f.close()
    
    f = open(r'test2.txt','w+')
	print(f.wrtie('hello world'))  #  11 
	print(f.wrtie('hello world\n')) # 12  
	print(f.wrtie('hello world'))  # 11
    
    print(f.tell()) 指针所在的位置
	print(f.seek())  两个参数 一个是偏移量
    f.close()
    
# 注意   但在Windows系统中 一行结束的标志是\r\n   他会把\n转化成\r\n   
操作 方法
读取指定大小的内容 f.read()
读取一行的内容 f.readline()
读取多行内容 f.readlines()
写入内容 f.write(data)
写入多行(需要自己加换行符) f.writelines(lines)
立即刷新缓冲 f.flush()
获得游标位置 f.tell()
调整游标位置 f.seek(position)

2、with open...as...(重点)

**问题:能不能写成一行 让解释器自动帮我关闭? **

with open('myfile.txt') as f:  # 赋值给 f这个变量
    print(f)
    
一旦条跳出这个语句块  就自动就帮你关掉了  这就是上下文管理器
with能够自动关闭文件,不需要执行close方法

with open('text.txt','w+') as f:
    print(f.write('hello world\n'))
    print(f.write('hello world\n'))
    f.flush()
    print(f.tell())
    f.seek(0,0)
    print(f.read())
    
Python 文件 flush() 方法是用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。
一般情况下,文件关闭后会自动刷新到硬盘中,但有时你需要在关闭前刷新到硬盘中,这时就可以使用 flush() 方法。

with open('text.txt','r+') as f:   # 多行读取
    print(f.readlines()[2])   # 可以切片
    
with open('text.txt','w+') as f:   # 多行写入
    f.writelines(['hello\n','world'])  怎么读出来 就怎么写进去
    f.seek(0)     读写都会导致指针的移动
    print(f.read())
    
如果使用二进制写入  能否不用二进制读取?
with open('test1.txt','wb+') as f:
    f.write('我们永远记得你'.encode())
    f.seek(0)
    a =f.read()
    print(a)  #   print(a.decode())
    
图片操作
with open(r"D:\Windows 10 Documents\Desktop\03.jpg",'rb+') as f:
    a = f.read()
    with open(r"test3.jpg",'wb+') as f1:
        f1.write(a)
----------------------------------------------------------------

# 一个with能不能打开多个文件?
with open(r'test2.txt','w+') as f,\
        open(r'test1.txt','a+') as f1:
        f.writelines(['hello\n','world'])
        f.seek(0)
        f1.seek(0)
        print(f1.read())
        print(f.read())
        
with open(r'test1.txt','r') as f1:
    with open(r'test2.txt','w') as f2:
        a = f1.read()
        print(a)
        f2.write(a)

总结:上下文管理器 不单单在文件里面有运用,在其他的地方也用的非常平凡,文件的操作在爬虫上用的非常之多

知识点二:认识异常(重点)

**目的:异常的掌握是程序员的基本要求,以后所有的bug 都可以通过异常的学习 开始自己排查错误**

PEP8

  • 1 缩进与换行 每级缩进使用四个空格
    2 限制每行的最大长度为79个字符
    3 空行
      顶层函数和类之间使用两个空行
      类的方法之间用一个空行
      在函数中使用空行表示不同逻辑段落
    4 导入位于文件的顶部
    5 避免多余空格
    6 注释
      注释要保持与时俱进 一句后面两个空格 跟注释
    7 命名规范
      除了正常的命名规范外
      不要使用 大小写的L 大写的O 作为变量名
      类名首字母大写 内部类 加上前导下划线
      函数名应该小写 增强可读性可以使用下划线分割
    8 其他
      别用 ‘==‘ 进行布尔值 和 True 或者 False 的比较 应该用 is
    

问题:

NameError: name "a" is not defined
SyntaxError: invalid syntax
TypeError: unsupported operand type(s) for -:"int" and "str"

异常的本身是什么:类的实例

1、异常基础

在 Python 中所有的异常都是继承自 BaseException
直接分为四大类:

SystemExit:Python退出异常
KeyboardInterrupt: 键盘打断(Ctrl+C)
GeneratorExit: 生成器退出
Exception: 普通异常(只会使用这部分的异常)

1、错误的回溯

def a():
    aaa
def b():
    a()
def c():
    b()
c()

最基本的try...except...搭配使用

try:
    print('---1--')
    print(a)# 没有定义
    print('----3---')
except:
    pass
# 缩进错误
a = 1
if a == 1:
    print(1)
  print(1)
	print(1)
Eg:# 成对出现
    try:
        a
    except:
        pass
try:
    with open('test.txt','r'):
        pass
except:# File
    print('发生了异常')
# 捕获具体的异常
try:
    a
    # 1/0
    # print(‘nihao’) # 语法错误捕获不到
except NameError:# 只能捕获具体异常   漏写的会打印出来
    print('类型错误')
except ZeroDivisionError:
    print('分母不能为0')
except Exception:# 代码里边异常的一个基类
    print('未知错误')
else:
    print('没有错误,触发else')
finally:
    print('不管有没有错误,都会执行')

**总结:异常的处理对于我们后续的逻辑有很大的帮助,在项目中不会应为个人原因或者网络原因导致系统的直接崩溃,而是利用对应的错误处理返回对应的提示信息,提升产品的体验度 **

posted @ 2023-08-31 21:25  csh逐梦  阅读(48)  评论(0编辑  收藏  举报