打开文件
Python 里使用 open内置函数打开一个文件
open参数介绍
file :用来打开指定的文件(不是文件的名字,而是文件的路径:相对路径和绝对路径)
mode:打开文件时的模式,默认是 r 表示只读
encoding:打开文件时的编码方式
文件的路径
路径分为两种:
- 绝对路径:从电脑盘符开始的路径
- 相对路径:当前文件所在文件夹开始的路径(如果你想打开的文件和你现在所写的文件在同一个文件,就可以直接写文件名)
(注意:我的路径应该是和你们的不一样的,不要直接复制,最好使用自己的文件路径)
# 在python的字符串里,\ 表示转义字符
# 路径书写的三种方式:1. \\ 2. r'\' 3.'/'
# file = open('E:\CloudMusic\pythonlearn\day10\xxx.txt')
# 路径分为两种:
# 1. 绝对路径:从电脑盘符开始的路径
# file = open('E:\\CloudMusic\\pythonlearn\\day10\\xxx.txt')
# file = open(r'E:\CloudMusic\pythonlearn\day10\xxx.txt')
file = open('E:/CloudMusic/pythonlearn/day10/xxx.txt')
print(file.read())
# 2.相对路径:当前文件所在文件夹开始的路径
# ../表示返回上一级文件夹
# ./ 可以省略,表示当前文件夹
file1 = open('demo/sss.txt')
print(file1.read())
file.close()
file1.close()
打开文件方式
r:只读模式,默认,打开文件以后只能读取,不能写入(默认)
w:写入模式,打开文件以后,只能写入,不能读取,如果文件存在,会覆盖原文件,也就是以前的文件内容会被清除,如果文件不存在会创建文件
a:追加模式,会在最后追加内容,如果文件不存在会创建文件,如果存在,就直接在最后追加内容
rb:以二进制的读取 wb/ab:以二进制写入,可用来进行文件是非字符串类型的读取与写入,就比如后面用爬虫爬取网上的视频与图片就可以使用wb方式
# mode:指的是打开文件的方式
# r:只读模式,默认,打开文件以后只能读取,不能写入
# file = open('xxx.txt','r')
# print(file.read())
# file.write('hello') 不能执行写入操作,会报错
# file=open('xx.txt','r') #文件不存在时会报错
# w:写入模式,打开文件以后,只能写入,不能读取,如果文件存在,会覆盖原文件,如果文件不存在会创建文件
# a:追加模式,会在最后追加内容,如果文件不存在会创建文件,如果存在,就直接在最后追加内容
# file = open('xxx.txt', 'w')
# file.write('hello world')#可以执行写入操作
# print(file.read()) # 不能够执行读取,会报错
# file = open('yyy.txt','w')
# b:以二进制的方式打开文件,可以用来操作用来操作非文本文件
# rb:以二进制的读取 wb/ab:以二进制写入
# file = open('xxx.txt','rb')
# print(file.read())
# file=open('xxx.txt','wb')
# file.write('我是你爹'.encode('utf8'))
# 不建议使用
# r+:可读可写.文件不存在时会报错
# w+:可写可读.如果文件存在,会覆盖原文件,如果文件不存在,会创建文件
file = open('xxx.txt', 'w+')
file.write('hahaha')
file.seek(0) # 写入之后,文件指针到最后,需要调用seek将文件指针重置到开头
print(file.read())
file.close()
注意:
- 以r的方式打开文件时,encoding是不是必须出现
如果文件格式为gbk,可以不加encoding=“gbk”
如果文件格式为utf-8,必须添加encoding=“utf-8” - 如果打开的文件是图片,音频或者视频等,打开方式采用rb,但是,此时,不能添加encoding=“xxx”
文件读取方式
file = open('sys模块的使用.py', encoding='utf8',newline='')
# print(file.read())#将所有的数据读取出来
# print(file.read(10))# 指的是10个字符
# readline # 只读取一行数据
# print(file.readline())
# readlines
# 读取全部的内容,返回的结果为一个列表,每一行数据为一个元素
# 注意:如果指明参数,则表示读取指定个数的字符
print(file.readlines(40))
file.close()
with关键字的使用
with 我们称之为上下文管理器,很多需要手动关闭的的连接
比如说 文件连接,socket连接,数据库的连接,都能使用with关键字自动连接
with关键字后面对象,需要实现__enter__和__exit__魔法方法
with open('01.作业.py','r',encoding='utf8') as fp:
fp.read()# 不需要手动关闭文件
# fp.close() # with关键字会自动帮我们关闭文件
异常处理
捕获异常
try-except-else
- a.try-except-else的用法类似于if-elif-else
- b.else可有可无,根据具体的需求决定
- c.try后面的代码块被称为监测区域【检测其中的代码是否存在异常】
- d.工作原理:首先执行try中的语句,如果try中的语句没有异常,则直接跳过所有的except语句,执行else;如果try中的语句有异常,则去except分支中进行匹配错误码,如果匹配到了,则执行except后面的语句;如果没有except匹配,则异常仍然没有被拦截【屏蔽】
def div(a,b):
return a / b
try:
x=div(5,1)
except Exception as e:# 如果程序出错,会立刻跳转到 except 语句
print('程序出错了')
else:# 程序运行如果没有出错,会运行else语句里的代码
print('运行结果是{}'.format(x))
try-except-finally
说明:不管try中的语句是否存在异常,不管异常是否匹配到了except语句,finally语句都会被执行
作用:表示定义清理行为,表示无论什么情况下都需要进行的操作
def div(a,b):
return a / b
try:
x=div(5,1)
except Exception as e:# 如果程序出错,会立刻跳转到 except 语句
print('程序出错了')
else:# 程序运行如果没有出错,会运行else语句里的代码
print('运行结果是{}'.format(x))
finally关键字的使用
def demo(a,b):
try:
x = a/b
except ZeroDivisionError:
print('除数不能为零')
else:
return x
finally:
return 'yes'# 如果函数里有finally,finally里的返回值会覆盖前面的返回值
print(demo(2, 4))# yes
print(demo(2, 0))
# 除数不能为零
# yes
csv文件的读写
这里需要导入csv模块
import csv
# csv文件
file = open('demo.csv', 'w', encoding='utf8', newline='')
# newline不写会多每次写入会多写入一行
w = csv.writer(file)
# 一行一行的写入
# w.writerow(('姓名','年龄','体重','身高'))
# w.writerow(('张三','18','100','175'))
# w.writerow(('李四','20','130','180'))
# 多行写入
w.writerows(
[
['姓名', '年龄', '体重', '身高'],
['张三', '18', '100', '175'],
['李四', '20', '130', '180'],
['王五', '20', '120', '174']
]
)
file.close()
# csv文件读取
file1 = open('demo.csv','r',encoding='utf8')
r = csv.reader(file1)
for x in r:
print(x)
'''
['姓名', '年龄', '体重', '身高']
['张三', '18', '100', '175']
['李四', '20', '130', '180']
['王五', '20', '120', '174']
'''
file1.close()