系列文章:
文件
文件读写
文件打开
文件打开的通用格式
with open("文件路径", "打开模式", encoding= "操作文件的字符编码") as f:
"对文件进行相应的读写操作"
使用 with块的好处:执行完毕后,自动对文件进行close操作
- 例1 一个简单文件的读取
with open("C:/Users/ytm/Desktop/测试文件.txt", "r", encoding="utf-8") as f: #第一步打开文件
text = f.read() # 第二步读取文件
print(text)
1、打开模式
“r” 只读模式,如文件不存在,报错
“w” 覆盖写模式,如文件不存在,则创建;如文件存在,则完全覆盖原文件
“x” 创建写模式,如文件不存在,则创建;如文件存在,报错
“a” 追加写模式,如文件不存在,则创建;如文件存在,则在原文件后追加内容
“b” 二进制文件模式,不能单独使用,需要配合使用如"rb",“wb”,“ab”,该模式不需指定encoding
“t” 文本文件模式,默认值,需配合使用 如"rt",“wt”,“at”,一般省略,简写成如"r",“w”,“a”
“+”,与"r",“w”,“x”,"a"配合使用,在原功能基础上,增加读写功能
打开模式缺省,默认为只读模式
2、文件路径
绝对路径或者相对路径
3、字符编码
- 万国码 utf-8 包含全世界所有国家需要用到的字符
- 中文编码 gbk 专门解决中文编码问题。
windows系统下,如果缺省,则默认为gbk(所在地区的编码)
为了清楚,除了处理二进制文件,建议不要缺省encoding
文件的读取
1、读取整个内容 f.read()
with open("C:/Users/ytm/Desktop/测试文件.txt", "r", encoding="utf-8") as f: #第一步打开文件
text = f.read() # 第二步读取文件
print(text)
临江仙·滚滚长江东逝水
滚滚长江东逝水,浪花淘尽英雄。
是非成败转头空。
青山依旧在,几度夕阳红。
白发渔樵江渚上,惯看秋月春风。
一壶浊酒喜相逢。
古今多少事,都付笑谈中。
解码模式不匹配
with open("C:/Users/ytm/Desktop/测试文件.txt", "r" ) as f: # encoding缺省windows系统默认为gbk
text = f.read() # 第二步读取文件
print(text)
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 50: illegal multibyte sequence
2、逐行进行读取- f.readline()
with open("C:/Users/ytm/Desktop/测试文件.txt", "r", encoding="utf-8" ) as f: # encoding缺省windows系统默认为gbk
for i in range(3):
text = f.readline()
print(text)
临江仙·滚滚长江东逝水
滚滚长江东逝水,浪花淘尽英雄。
是非成败转头空。
with open("C:/Users/ytm/Desktop/测试文件.txt", "r", encoding="utf-8" ) as f: # encoding缺省windows系统默认为gbk
while True:
text = f.readline()
if not text:
break
else:
print(text, end="") ## 保留原文的换行,使print()的换行不起作用
临江仙·滚滚长江东逝水
滚滚长江东逝水,浪花淘尽英雄。
是非成败转头空。
青山依旧在,几度夕阳红。
白发渔樵江渚上,惯看秋月春风。
一壶浊酒喜相逢。
古今多少事,都付笑谈中。
3、读入所有行,以每行为元素形成一个列表 f.readlines()
with open("C:/Users/ytm/Desktop/测试文件.txt", "r", encoding="utf-8" ) as f: # encoding缺省windows系统默认为gbk
text = f.readlines()
print(text)
['临江仙·滚滚长江东逝水\n', '滚滚长江东逝水,浪花淘尽英雄。\n', '是非成败转头空。\n', '青山依旧在,几度夕阳红。\n', '白发渔樵江渚上,惯看秋月春风。\n', '一壶浊酒喜相逢。\n', '古今多少事,都付笑谈中。']
with open("C:/Users/ytm/Desktop/测试文件.txt", "r", encoding="utf-8" ) as f: # encoding缺省windows系统默认为gbk
for text in f.readlines():
print(text,end="")
临江仙·滚滚长江东逝水
滚滚长江东逝水,浪花淘尽英雄。
是非成败转头空。
青山依旧在,几度夕阳红。
白发渔樵江渚上,惯看秋月春风。
一壶浊酒喜相逢。
古今多少事,都付笑谈中。
4、文本文件读取小结
文件比较大时,read()和readlines() 占用内存过大,不建议使用
readline用起来又不太方便
5、二进制文件
with open("test.jpg", "rb") as f:
print(len(f.readlines()))
文件写入
1、向文件写入一个字符串或者字节流(二进制)f.write()
with open("恋曲1980.txt", "w", encoding="utf-8") as f:
f.write("你曾经对我说\n") # 文件不存在则立刻创建一个
f.write("你永远爱着我\n") #如果文件存在,则会覆盖!!!
f.write("爱情这东西我明白\n")
f.write("但永远是什么\n") # 如需换行,末尾加换行符\n
2、追加模式——“a”
3、将一个元素为字符串的列表整体写入文件——f.writelines()
ls = ["春天刮着风", "秋天下着雨", "春风秋雨多少海誓山盟随风远去"]
with open("C:/Users/ytm/Desktop/测试文件.txt", "w", encoding="utf-8" ) as f: # encoding缺省windows系统默认为gbk
f.writelines(ls)
异常处理
常见的异常产生
- 除0运算 ZeroDivisionError
- 找不到可读文件 FileNotFoundError
- 值错误 ValueError
传入一个调用者不期望的值,即使这个值的类型是正确的
s = “1.3”
n = int(s) - 索引错误 IndexError
下标越界 - 类型错误 TypeError
NameError 使用一个未被定义的变量
KeyError 试图访问字典里不存在的键
当异常发生的时候,如果不预先设定处理方法,程序就会中断
异常处理
try_except
- 如果try内代码块顺利执行,except不被触发
- 如果try内代码块发生错误,触发except,执行except内代码块
- 万能异常 Exception (所有错误的老祖宗)
- 捕获异常的值 as
- 如果try 模块执行,则else模块也执行 ry_except_else
- 可以将else 看做try成功的额外奖赏
- 不论try模块是否执行,finally最后都执行 try_except_finally
x = 10
y = 0
ls = []
d = {"name":"大杰仔"}
try:
z = x/y
except ZeroDivisionError:
print("0不可以被除!!!")
except NameError:
print("变量名不存在")
except KeyError:
print("键不存在")
except Exception as e: #万能异常 Exception (所有错误的老祖宗)
print("出错啦!")
print(e) #捕获异常
else:
print("else 看做try成功的额外奖赏")
finally:
print("不论触不触发异常,都将执行")
模块
已经被封装好,无需自己再“造轮子”,声明导入后,拿来即用
广义模块分类
- Python内置
时间库time 随机库random 容器数据类型collection 迭代器函数itertools - 第三方库
数据分析numpy 、pandas 数据可视化matplotlib 机器学习scikit-learn 深度学习 Tensorflow - 自定义文件
单独py文件
包----多个py文件
模块导入
- 导入整个模块----- import 模块名
import time
start = time.time()
time.sleep(3)
end = time.time()
print("程序运行用时:{}".format(end-start))
import fun1
fun1.f1()
- 从模块中导入类或函数---- from 模块 import 类名或函数名
from itertools import product
ls = list(product("AB","123"))
print(ls)
[('A', '1'), ('A', '2'), ('A', '3'), ('B', '1'), ('B', '2'), ('B', '3')]
from function.fun1 import f1 # 注意这种用法
f1()
一次导入多个
from function import fun1, fun2
fun1.f1()
fun2.f2()
- 导入模块中所有的类和函数—from 模块 import *
from random import *
print(randint(1,100)) # 产生一个[1,100]之间的随机整数
print(random()) # 产生一个[0,1)之间的随机小数
模块查找路径
模块搜索查找顺序:
- 优先从内存中导入模块
- 内置模块
# Python 启动时,解释器会默认加载一些 modules 存放在sys.modules中
# sys.modules 变量包含一个由当前载入(完整且成功导入)到解释器的模块组成的字典, 模块名作为键, 它们的位置作为值
import math
import sys
# print(sys.modules)
print("math" in sys.modules) #True
print("numpy" in sys.modules) #False
sys.path路径中包含的模块
import sys
print(sys.path)
- sys.path的第一个路径是当前执行文件所在的文件夹
- 若需将不在该文件夹内的模块导入,需要将模块的路径添加到sys.path
import sys
sys.path.append("C:\\Users\\ibm\\Desktop") # 注意是双斜杠
import fun3
fun3.f3()