文件
课题:文件
目的:文件不能可能一直在内存中存储,持久化存储到磁盘就需要用到文件了!
知识点一:文件与上下文管理器(重点)
问题:我们的程序是不是都是运行在内存中的,那内存是不可持久化存储的,那怎样才能持久存储呢?
问题: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('不管有没有错误,都会执行')
**总结:异常的处理对于我们后续的逻辑有很大的帮助,在项目中不会应为个人原因或者网络原因导致系统的直接崩溃,而是利用对应的错误处理返回对应的提示信息,提升产品的体验度 **
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App