本次内容:文件+异常处理
>> Python每日笔记—目录 <<
文件
- 文件打开函数open()
open():打开一个文件,并且返回文件对象,对文件的处理过程都需要使用open这个方法。
如果文件打不开,会抛出OSError异常
注意:使用open方法一定要保证关闭文件对象,即调用close方法
open方法一般使用两个参数 文件名和模式
open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
file:必须参数,文件路径,(当前路径:文件名称)/(相对路径,或者绝对路径)
mode:可选,文件打开模式 r-读 w-写 a-追加…
buffer:可选,文件打开模式
encoding:编码格式 (utf-8)
errors:报错级别
newline:区分换行符
file1 = open("test.txt", 'w', encoding="utf-8")
file1.write("今天适合放风筝,而不是在这上课,哈哈")
'''测试一下写入,这里会报错!'''
message = file1.read()
print(message)
'''思考一下读的操作为什么读取不了?
因为以写入的mode打开,所以无法读取'''
以读的形式和追加的形式操作文件
每一次操作完文件,记得使用close函数关闭文件
file1 = open("test.txt", 'r', encoding='utf-8')
message = file1.read()
print(message) # 今天适合放风筝,而不是在这上课,哈哈
file1.close()
file1 = open("test.txt", 'a', encoding='utf-8')
file1.write("。下课了!!!") # 今天适合放风筝,而不是在这上课,哈哈。下课了!!!
file1.close()
- 文件的读取方式
file.readline(limit):返回一行。limit:一行输出几个字符
file.readlines([size]) :返回包含size行的列表, size 未指定则返回全部行。
for line in f: print line :通过迭代器访问。
# test.txt文件内容
登鹳雀楼
王之涣(唐)
白日依山尽,黄河入海流。
欲穷千里目,更上一层楼。
''''''
# message = file1.readline(3)
# print(message) # 登鹳雀
message = file1.readlines()
print(message) # # ['登鹳雀楼\n', '王之涣(唐)\n', '白日依山尽,黄河入海流。 \n', '欲穷千里目,更上一层楼。']
file1.close()
- seek设置偏移量
test2.txt
abcd
'''
seek函数
file1.seek(偏移量,起始位置)
'''
# 正常读取
file1 = open("test2.txt", 'r', encoding='utf-8')
message = file1.read()
print(message) # abcd
'''指针偏移了两个位置'''
file1.seek(2, 0)
message = file1.read()
print(message) # cd
- 文件的备份
# 1、用户输入一个目标文件
old_name = input("请输入要备份的文件")
print(old_name)
# 2、规划备份文件的名字
'''
提取后缀:找到文件名中的点,名字和后缀分离,最右侧的点才是后缀名的点
'''
index = old_name.rfind(".") # 查找文件名中最右边的点.
print(index)
if index > 0:
postfix = old_name[index:] # 使用切片的方式
print(postfix)
new_name = old_name[:index] + '[备份]' + postfix
old_f = open(old_name, 'r', encoding="utf-8")
new_f = open(new_name, 'w', encoding="utf-8")
# 源文件读取,备份文件写入
# 如果我们不确定目标文件大小,循环读取写入,当读不到数据的时候,循环终止
while True:
con = old_f.readline()
if len(con) == 0:
# 读取结束
break
new_f.write(con)
# 关闭文件
new_f.close()
old_f.close()
- 文件夹和文件操作
如下代码不要重复运行,会报错
'''导入os模块'''
import os
# 1、重命名-rename
os.rename("sound.mp3", 'Voice.mp3')
# 2、删除文件-remove
os.remove("SOUND.mp3")
# 3、创建文件夹mkdir
os.mkdir('aa')
# 4、删除文件夹rmdir
os.rmdir('aa')
os.rename('aa', 'bb')
文件路径操作:
# 返回当前文件所在路径
print(os.getcwd()) # E:\Python\Day06
# 改变目录路径
os.chdir("../Day05")
print(os.getcwd()) # E:\Python\Day05
# 获取某个文件夹下的所有文件,返回一个列表
print(os.listdir("../Day03"))
# ['01-while.py', '02-while.py', '04-while.py', '05-for.py'...]
小练习:创建一个文件夹,名字叫test1中创建一个test2的文件夹
# 第一种(手动输入路径的方法)
# os.mkdir("test1")
# os.mkdir("test1/test2")
# 第二种(改变路径的方法)
os.chdir("test1") # 改变os的路径到test1
os.mkdir("test2")
- 文件批量重命名
关键点:如何保留文件后缀名
listdir():将文件名转化为列表
rename():重命名文件名
# 需求,将test1文件夹下面的所有文件重命名为:python_xxx
'''实例操作步骤:
file_list = ['test1', 'test2']
1、修改前缀
new_name = Python_test1
2、还原前缀
num = 6
new_name = test1
使用rename方法
...循环操作...
'''
import os
# 找到所有的文件
os.chdir("../test1") # 首先切换目录
file_list = os.listdir() # 转换为list类型
# 构造名字
flag = 2 # 手动修改参数
for i in file_list:
if flag == 1: # 修改前缀
new_name = 'Python_' + i
elif flag == 2: # 删除前缀
num = len("Python_") # 获取前缀长度
new_name = i[num:] # 使用切片方法
# 重命名
os.rename(i, new_name) # 把切片后的字符串重置
异常处理
异常:
- 即python中程序的语法是正确的(编译的时候不报错),在运行的时候可能会发生错误
- 在运行期间检测到的错误被称为异常。
- 异常以不同的类型出现,这些类型都作为信息的一部分打印出来。
- 例如:NameError、TypeError、ValueError等
- 错误信息的前面部分,显示了异常信息的上下文
- 异常的处理 try/exect:
# while True:
# num = int(input("请输入一个数字:"))
# break
'''输入一个字符串后会出现如下异常
Traceback (most recent call last):
File "E:/Python/JSNU/Day07/01-异常.py", line 8, in <module>
num = int(input("请输入一个数字:"))
ValueError: invalid literal for int() with base 10: 'aaa'
'''
'''异常捕获
异常会以设定的语句进行提示
try语句,执行try与except之间的内容,如果没有异常发生,忽略except的子句。执行try,结束。
如果执行try子句的过程中出现了异常,try子句余下的内容将被忽略,不再执行
如果异常和except后面的名字相符,则执行except子句
如果异常没有与任何except匹配,那么这个异常将会传递给上层的try中
'''
while True:
try:
num = int(input("请输入一个数字:"))
break
except ValueError:
print("您输入的不是数字请再次尝试输入!")
- 多个except语句的情况
'''测试一个try可以对应多个except子句,分别处理不同的特定的异常
最多只会处理一个except子句
'''
import sys
try:
'''my_file.txt的内容为空'''
# f = open("myfile.txt") # OSError:[Errno 2] No such file or directory: 'myfile.txt'
f = open("my_file.txt") # 读取内容引起异常
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OSError:{0}".format(err))
except ValueError:
print("读取内容引起异常")
except:
'''
可以忽略异常的名称,它被当作通配符使用。
我们可以使用这种方法打印一个错误信息,然后再次把异常抛出
'''
print("测试", sys.exc_info()[0])
- try-except-else语句
'''
try/except语句中还有一个可选的else语句。如果要使用else子句。
那么else要放在所有的except之后
else:在try子句在没有发生任何异常情况后才执行
'''
try:
num = int(input("请输入一个整数:"))
print(1/num)
except Exception as result:
print(result)
else:
print("当没有异常的时候,执行的代码块")
- raise关键字
首先给出一个例子,再说明raise作用
# raise抛异常
x = 10
if x > 5:
raise Exception('x的值不能大于5,当前x的值为:{}'.format())
'''抛出异常:
Traceback (most recent call last):
File "E:/Python/JSNU/Day07/04-异常.py", line 11, in <module>
raise Exception('x的值不能大于5,当前x的值为:{}'.format())
IndexError: tuple index out of range
'''
'''
:raise是唯一的一个参数指定要抛出的异常类
如果只是想知道哪个地方抛出了异常,而不想对它进行处理,那么就使用raise语句
'''
try:
raise NameError("你好")
except NameError:
print("你好吗?")
raise
'''抛出异常:
你好吗?
Traceback (most recent call last):
File "E:/Python/JSNU/Day07/04-异常.py", line 18, in <module>
raise NameError("你好")
NameError: 你好
'''
解释一下,上述的“你好吗?”可以正常输出,找到了你好语句的异常错误,但是不做处理,继续处理print(“你好吗?”)这句话。