小白学python :DAY4

文件操作,异常处理

读文件:
    open(path/filename,'rt')----->返回值:stream(管道)
    container=stream.read()------>读取管道中内容
    注:如果传递的path/filename有误,则会报错:FileNotFoundError
        如果是图片,不能使用默认的读取方式,需要mode=’rb‘
    总结:read()

stream = open(r'E:\p1\aa.txt')  # mode默认是read.绝对路径
container = stream.read()  # read()
print(container)
         readline():每次读取一行

stream = open(r'E:\p1\aa.txt') 
line = stream.readline()#读取一行
print(line)
# 读取所有内容
while True:
    line=stream.readline()
    print(line)
    if not line:
        break
         readlines():读取所有行,保存到列表中
stream = open(r'E:\p1\aa.txt') 
lines=stream.readlines()#['feskhsj\n', 'hfshfhs']将内容保存到列表中
print(lines)
# 将列表中内容打印出
lines=stream.readlines()
print(lines)
for i in lines:
    print(i)
         readable():判断是否可读
stream = open(r'E:\p1\aa.txt')
result = stream.readable()  # 方法后面加able,判断是否,返回值为bool类型
print(result)
写文件
mode='w'-->表示写操作,会将原有内容清空
方法:
    write(内容):每次都会将原来的内容清洗,然后写当前的内容

stream = open(r'E:\p1\aa.txt', 'w')
#  '''...'''保留格式输出
s = '''
 你好!
 欢迎来到赌场....
          邀请人:高静
'''
result = stream.write(s)  # 写操作:
stream.write('张三')
stream.writelines(['\nhello world\n', '快乐星球\n'])
# ...只要管道不关闭,可以无限添加
stream.close()  # 内存将通道回收,释放资源
    writelines(iterable):没有换行的效果,需自加
     
mode='a'---->追加,不会清空当前内容。append
stream = open(r'E:\p1\aa.txt', 'a')
s = '这段内容是在现有内容上添加上去的。。。。'
result = stream.write(s)
stream.close()
文件的复制
原文件:E:\p1\人像图.jfif
目标文件:E:\p2\人像图.jfif
with 结合open使用,可以帮我们自动释放资源
with open(r'E:\p1\人像图.jfif', 'rb') as stream:
    container = stream.read()  # 读取文件内容

    with open(r'E:\p2\人像图.jfif', 'wb') as wstream:
        wstream.write(container)
print('文件复制成功!')

stream.close()

os模块:

os.path:常用函数
    dirname():获取指定文件目录
    join():可拼接多个
    split():分割(文件目录,文件名)
    splittext():分割(文件目录\文件名,文件的扩展名)
    getsize():获取文件大小
    isabs():判断是否是绝对路径
    isfile():判断是否是文件
    isdir():判断是否是文件夹
os.path.dirname(__file__):获取当前文件所在的文件目录,(绝对路径)
import os
print(os.path.dirname(__file__))  # 获取当前文件所在的文件夹的路径,(绝对路径)

#获取当前文件所在文件夹,类似于os.path.dirname(__file__)
path = os.getcwd()
print(path)
os.path.abspath('aa.txt'):通过相对路径得到绝对路径
import os
path = os.path.abspath('aa.txt')
print(path)
os.path.abspath(__file__):获取当前文件的绝对路径
import os
path = os.path.abspath(__file__)
print(path)
os.path.split(path):获取文件名
import os

# 获取当前文件的文件名
path = r'D:\p\code\aa\文件操作.py'

#获取文件名
result = os.path.split(path)  # 结果: ('D:\\p\\venv\\Scripts\\python.exe D:\\p\\code\\aa', '文件操作.py')
print(result[1])
filename = path[path.rfind('\\' + 1):]#获取名字
print(filename)
os.path.splitext(path):分割文件与扩展名
import os
path = r'D:\p\code\aa\文件操作.py'
result = os.path.splitext(path)  # ('D:\\p\\code\\aa\\文件操作', '.py')
print(result[1])
os.path.getsize(path):获取文件的大小,单位字节
import os
path = r'D:\p\code\aa\文件操作.py'
size = os.path.getsize(path)
print(size)
将p1\人像图.jfif保存到当前文件所在的目录下
import os
with open(r'E:\p1\人像图.jfif', 'rb') as stream:
    container = stream.read()  # 读取文件内容
    print(stream.name)  # 获取文件绝对路径
    # 截取文件名
    file = stream.name
    filename = file[file.rfind('\\') + 1:]

    path = os.path.dirname(__file__)
    path1 = os.path.join(path, filename)  # 在path下拼接一个文件

    with open(path1, 'wb') as wstream:
        wstream.write(container)
print('文件复制成功!')
os模块下方法
os.getcwd() 获取当前目录
os.listdir() 浏览文件夹
os.mkdir()  创建文件夹
os.rmdir()  删除空的文件夹
os.remove() 删除文件
os.chdir()  切换目录
import os
# 返回指定目录下所有的文件和文件夹,保存到列表中
a11 = os.listdir(r'E:\p1')
print(a11)

# 创建文件夹
f=os.mkdir(r'E:\p3')
print(f)

# 创建文件之前判断文件是否存在
if not os.path.exists(r'E:\p3'):
    f = os.mkdir(r'E:\p3')
    print(f)

# 删除文件夹,,rmdir():只能删除空文件夹
f=os.rmdir(r'E:\p3')
print(f)
f=os.removedirs(r'E:\p3')
print(f)

os.remove(r'E:\p3\p4\aa.doc')  # 成功删除aa.doc

# 删除p4文件夹,p4文件夹里有文件
path = r'E:\p3\p4'
filelist = os.listdir(path)
for file in filelist:
    path1 = os.path.join(path, file)
    os.remove(path1)
else:
    os.rmdir(path)
print('删除成功!')

# 切换目录
f = os.chdir('E:\p1')
print(f)
path = os.getcwd()
print(path)
文件复制:如何将一个文件夹里面的内容复制到另一个文件夹
# 封装成函数
import os


def copy(src, target):  # src:原文件夹,target:目标文件夹

    if os.path.isdir(src) and os.path.isdir(target):
        # 浏览原文件夹中文件
        filelist = os.listdir(src)  # ['aa.txt','','',...,'']
        # 遍历文件名
        for file in filelist:
            path = os.path.join(src, file)  # 在原路径的基础上添加文件,得到完整路径
            with open(path, 'rb') as rstream:
                container = rstream.read()
                # 获取文件名

                path1 = os.path.join(target, file)
                # open()只能打开文件,不能打开目录文件夹
                with open(path1, 'wb') as wstream:
                    wstream.write(container)
        else:
            print('复制文件完成!')


copy('E:\p1', 'E:\p2')
'''

文件复制练习
'''
import os

src_path = r'E:\p1'
target_path = r'E:\p3'


def copy(src_path, target_path):
    # 获取文件夹中内容
    filelist = os.listdir(src_path)  # ['a1.doc', 'aa.txt', 'pp', '人像图.jfif']
    print(filelist)
    # 变量列表
    for file in filelist:
        # 拼接路径
        path = os.path.join(src_path, file)
        # 判断是文件夹还是文件
        if os.path.isdir(path):
            # 递归调用
            copy(path, target_path)

        else:
            # 不是文件夹则进行复制
            with open(path, 'rb') as rstream:
                container = rstream.read()
                # 获取文件名
                path1 = os.path.join(target_path, file)
                # open()只能打开文件,不能打开目录文件夹
                with open(path1, 'wb') as wstream:
                    wstream.write(container)
    else:
        print('复制完成!')


copy(src_path, target_path)
# 用户注册
def register():
    username = input('输入用户名:')
    password = input('输入密码:')
    repassword = input('输入确认密码:')
    if password == repassword:
        # 保存信息
        with open(r'E:\p1\book\users.txt', 'a') as wstream:
            wstream.write('\n{} {}\n'.format(username, password))  # write需要的参数类型是字节对象不是字符串

        print('用户注册成功!')
    else:
        print('密码不一致!')
register()
# 用户登录
def login():
    username = input('输入用户名:')
    password = input('输入密码:')
    if username and password:
        with open(r'E:\p1\book\users.txt') as rstream:
            while True:
                user = rstream.readline()

                if not user:
                    print('用户名或者密码输入有误!')
                    break

                input_user = '{} {}\n'.format(username, password)
                if user == input_user:
                    print('用户登录成功!')
                    break
login()
# 展示图书
def show_books():
    print('-------图书馆中书-------')
    with open(r'E:\p1\book\books.txt', 'r', encoding='utf-8') as rstream:
        books = rstream.readlines()
        for book in books:
            print(book)
show_books()
异常:运行时出现错误,xxxError
情况1:
    try:
        有可能会产生多种异常
    except 异常的类型1:
        pass
    except 异常的类型2:
        pass
        ...
    except Exception:
        pass
如果是多个except,Exception放在最下面
def func():
    try:  # 只要出现异常,下方代码都不执行;加上try后,会执行
        n1 = int(input('输入第一个数字:'))
        n2 = int(input('输入第二个数字:'))
        oper = input('输入运算符号(+ - * %):')
        result = 0
        if oper == '+':
            result = n1 + n2
        elif oper == '-':
            result = n1 - n2
        elif oper == '*':
            result = n1 * n2
        elif oper == '/':
            result = n1 / n2
        else:
            print('符号输入错误!')
        print('结果是:', result)

        #文件操作---》将运算结果放在一个文档里
        # with open(r'E:\p1\aa.txt','w')as wstream:
        #     wstream.write('本次的运算结果:{}'.format(result))
        #操作列表
        list1=[]
        list1.pop()

        with open(r'E:\p1\aa2.txt', 'r') as wstream:#读一个不存在的文件
            print(wstream.read())

    except ZeroDivisionError:
        print('除数不能为0!!!')
    except ValueError:
        print('必须输入数字!!')
    # except FileExistsError:
    #     print('文件不存在!')
    # except NameError:
    #     pass
    except Exception as err:#可看出错误原因
        print('出错了!',err)


func()
print('------>')
try:
        有可能会产生多种异常
    except 异常的类型1:
        pass
    
        ...
    else:
        如果try中没有发生异常则进入的代码
注意:如果使用else则在try代码中不能出现return
def func():
    try:
        n1 = int(input('输入数字:'))
        print(n1)
        # return 1
    except ValueError:
        print('必须是数字')
        # return 2
    else:
        print('数字输入完毕')  # 没有异常才会执行的代码块


func()
文件操作;stream=open(...)   stream.close()--->无论出现异常,都会执行
    try:
        可能出现的异常代码
    except:
        如果有异常执行的代码
    finally:
        无论是否存在异常都会被执行的代码
def func():
    stream = None
    try:
        stream = open(r'E:\p1\aa.txt')
        container = stream.read()
        print(container)
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:  # 有无异常都执行;如果有finally在,finally中return会覆盖其他中return
        print('-------finally---')
        if stream:
            stream.close()
        # return 3


x = func()
print(x)
抛出异常   手动异常 raise
格式:
    raise 异常类型('提示信息')
    
练习:注册   用户名必须6位
def register():
    username = input('输入用户名:')
    if len(username) < 6:
        raise Exception('用户长度必须6位以上')  # 抛出异常
    else:
        print('输入用户名:{}'.format(username))


try:  # 接异常
    register()
except Exception as err:
    print(err)  # 打印raise中错误类型
    print('注册失败')
else:
    print('注册成功')

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值