Python每日笔记08(文件+异常处理)

本次内容:文件+异常处理

>> Python每日笔记—目录 <<

文件

  1. 文件打开函数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()
  1. 文件的读取方式
    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()

  1. 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. 文件的备份
# 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()
  1. 文件夹和文件操作
    如下代码不要重复运行,会报错
'''导入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")
  1. 文件批量重命名
    关键点:如何保留文件后缀名
    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等
    - 错误信息的前面部分,显示了异常信息的上下文
  1. 异常的处理 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("您输入的不是数字请再次尝试输入!")
  1. 多个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])
  1. 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("当没有异常的时候,执行的代码块")
  1. 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(“你好吗?”)这句话。

如果这篇文章对你有帮助的话,点个赞呗

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值